Matlab 读写*.xml文件

本文介绍了如何在Matlab中读取和写入*.xml文件,包括读取标注信息、可视化数据、写入目标数据的步骤,并提供了相关函数示例。

Matlab 读写*.xml文件

1.摘要

       因为经常使用将图像中的目标标注信息保存在*.xml文件中。在训练深度神经网络是常用这样的训练数据。有时候需要使用原有的数据来扩充数据,而最常用的工具也就是Matlab(这里示例使用的Matlab2016b)。在这篇博文中主要介绍:①Matlab读取*.xml文件信息;②将*.xml文件中的信息显示在对应的图像上,可以简单可视化数据;③将在图像中的目标数据写入*.xml文件中; ④读取*.xml文件相关的函数。将Matlab相关代码附上,希望对大家有所帮助。

如果对你有所帮助,请帮忙打“Call”点赞哈,谢谢啦!!!

%%  
%文件创建:Carlson 2018.04.11
%全部功能:
%       1.读、写xml文件
%       2.读xml文件并显示目标信息
%目的:
%       1.显示检测图像中标注是否正确
%       2.更改或者扩充数据使用
%% 初始化 
%注意修改下面四个值  
clear
xmlfilepath='Annotations'; %标注文件*.xml的位置
ImagefilePath='JPEGImages'; %图像文件*.jpg的位置
NewxmlPath='AnnotationsNew'; %保存新的*.xml文件位置
NewImgPath='JPEGImagesNew'; %保存新的*.jpg文件位置
%% Main 函数
%示例1
[Imageinfo,ImageObject]=Readxmlfile([xmlfilepath,'\','IMG_044.xml']);
%示例2
CheckxmlandImg(xmlfilepath,ImagefilePath)
%示例3
%imageinfo={'IMG_002.jpg',1123,1233,3};
%imageObject={
   
   {'object1',11,22,33,44},{'object2',111,122,313,414}};
%Writexmlfile(imageinfo,ImageObject,NewxmlPath);
Writexmlfile(Imageinfo,ImageObject,NewxmlPath);

如下是*.xml文件的内容:

<?xml version="1.0" encoding="utf-8"?>
<annotation>
   <folder>hudie</folder>
   <filename>IMG_044.jpg</filename>
   <path>C:\Carlson\Dataset\IMG_044.jpg</path>
   <source>
      <database>Unknown</database>
   </source>
   <size>
      <width>4288</width>
      <height>2848</height>
      <depth>3</depth>
   </size>
   <segmented>0</segmented>
   <object>
      <name>object1</name>
      <pose>Unspecified</pose>
      <truncated>0</truncated>
      <difficult>0</difficult>
      <bndbox>
         <xmin>1028</xmin>
         &
<think>我们之前讨论了如何读写.m文件,但用户现在询问的是.mlx文件。根据引用[1],.mlx文件MATLAB Live Script文件,它实际上是一个ZIP压缩包,包含多个XML文件和资源文件。因此,我们不能像处理纯文本.m文件那样直接读写。 解决方案: 1. 读取.mlx:解压缩.mlx文件,然后解析其中的XML文件(主要是`matlab/document.xml`)来获取内容。 2. 写入.mlx:按照.mlx的内部结构创建XML文件文件夹,然后压缩成ZIP包并重命名为.mlx。 但是,请注意:.mlx文件格式是二进制的(尽管内部是文本的XML),并且其内部结构可能随MATLAB版本变化。因此,直接操作.mlx文件需要谨慎。 步骤详解: 读取.mlx文件: - 将.mlx文件重命名为.zip文件(例如:`example.mlx` -> `example.zip`) - 解压该ZIP文件 - 在解压后的文件夹中,找到`matlab/document.xml`,这个文件包含了主要的文本和代码内容(但格式XML) - 使用XML解析器(如`xml.etree.ElementTree`)解析该文件,提取文本和代码 写入.mlx文件: - 创建一个临时文件夹,按照.mlx的内部结构创建必要的文件文件夹(包括`matlab/document.xml`等) - 将需要写入的内容按照.mlx的XML格式构造到`document.xml`中 - 将整个文件夹压缩成ZIP文件 - 将ZIP文件重命名为.mlx 但是,由于.mlx文件格式复杂,手动构造XML内容非常繁琐,且容易出错。通常,更推荐的做法是: - 在MATLAB中,将.mlx文件另存为.m文件,然后用Python读取纯文本的.m文件(如前所述) - 或者,使用MATLAB的API(如MATLAB Engine for Python)来执行.mlx文件并获取结果,而不是直接读写文件内容 由于直接操作.mlx文件较为复杂,以下仅提供一个概念性的读取示例(不处理所有情况,仅作演示): 读取示例: ```python import zipfile import xml.etree.ElementTree as ET def read_mlx(mlx_file): # 临时解压目录 temp_dir = 'temp_mlx_extract' with zipfile.ZipFile(mlx_file, 'r') as zip_ref: zip_ref.extractall(temp_dir) # 解析document.xml doc_xml = os.path.join(temp_dir, 'matlab', 'document.xml') tree = ET.parse(doc_xml) root = tree.getroot() # 这里需要根据.mlx的XML结构来提取内容,结构较复杂 # 通常,文本和代码位于不同的节点中,例如代码可能在<text>节点的<mcode>子节点中 # 以下仅为示例,实际结构需要详细分析 content = [] for node in root.iter(): # 根据实际标签提取,这里只是一个示例 if node.tag.endswith('text'): text = node.text if node.text else '' content.append(text) # 清理临时目录(可选,根据需求) # ... 删除临时目录 return '\n'.join(content) ``` 写入示例(更复杂,不推荐直接操作): 由于写入需要构造完整的XML结构,包括命名空间等,且需要包含所有必要的文件(如图片资源等),这里不提供具体代码。 替代方案: 1. 使用MATLAB的`export`功能:在MATLAB中将.mlx导出为.m,然后用Python读写.m文件。 2. 使用MATLAB Engine for Python:在Python中调用MATLAB,让MATLAB处理.mlx文件。 关于MATLAB Engine for Python的使用示例: ```python import matlab.engine eng = matlab.engine.start_matlab() # 将.mlx转换为.m(在MATLAB中执行) eng.eval("export('my_script.mlx', 'my_script.m')", nargout=0) # 然后读取my_script.m with open('my_script.m', 'r') as f: content = f.read() ``` 注意:此方法需要安装MATLAB并配置好引擎。 总结: - 直接读写.mlx文件复杂且易出错,推荐通过MATLAB转换格式后再用Python处理。 - 如果必须直接操作,需要深入理解.mlx的ZIP内部结构和XML格式。 相关问题: 1. 如何在不安装MATLAB的情况下读取.mlx文件? 2. 如何将Python数据转换为.mlx文件中的图表? 3. MATLAB Live Script (.mlx) 文件格式的详细结构是什么? 注意:由于.mlx文件格式未公开,上述方法可能因MATLAB版本不同而失效。</think># Python 读写 MATLAB .mlx 文件详解 MATLAB 的 `.mlx` 文件(Live Script 文件)本质上是**包含代码、输出和格式的压缩包**,与纯文本的 `.m` 文件不同。以下是 Python 处理 `.mlx` 文件的完整方法: ## 1. .mlx 文件结构解析 `.mlx` 文件实际是一个 ZIP 压缩包,包含以下关键文件: - `matlab/document.xml` - 核心内容(代码、文本、公式) - `matlab/media/` - 存储图像等媒体资源 - `matlab/metadata/coreProperties.xml` - 元数据(如作者信息)[^1] ## 2. 读取 .mlx 文件内容 ### 方法 1:解压缩提取文本内容 ```python import zipfile import xml.etree.ElementTree as ET import re def read_mlx(mlx_path): """读取 .mlx 文件并提取文本内容""" with zipfile.ZipFile(mlx_path, 'r') as zip_ref: # 提取 document.xml xml_content = zip_ref.read('matlab/document.xml').decode('utf-8') # 清理 XML 标签 text_content = re.sub(r'<[^>]+>', '', xml_content) # 移除命名空间声明 text_content = re.sub(r'xmlns(:\w+)?="[^"]+"', '', text_content) # 替换特殊字符 text_content = text_content.replace('<', '<').replace('>', '>') return text_content # 示例用法 content = read_mlx('example.mlx') print(content) ``` ### 方法 2:提取特定元素(代码块) ```python def extract_code_from_mlx(mlx_path): """提取 .mlx 文件中的 MATLAB 代码""" with zipfile.ZipFile(mlx_path, 'r') as zip_ref: xml_content = zip_ref.read('matlab/document.xml').decode('utf-8') # 解析 XML 提取代码块 root = ET.fromstring(xml_content) namespace = {'m': 'http://schemas.mathworks.com/matlab'} code_blocks = [] for code_elem in root.findall('.//m:code', namespace): code_blocks.append(code_elem.text) return '\n'.join(code_blocks) # 示例用法 matlab_code = extract_code_from_mlx('example.mlx') print(matlab_code) ``` ## 3. 创建 .mlx 文件 ### 基本模板创建 ```python import os import zipfile import tempfile def create_mlx(output_path, title="My Script", author="Python Generated"): """创建基本 .mlx 文件模板""" # 创建临时工作目录 with tempfile.TemporaryDirectory() as tmpdir: mlx_dir = os.path.join(tmpdir, 'matlab') os.makedirs(mlx_dir) # 创建核心文档 XML doc_xml = f"""<?xml version="1.0" encoding="utf-8"?> <document xmlns="http://schemas.mathworks.com/matlab"> <metadata> <title>{title}</title> <creator>{author}</creator> </metadata> <content> <section> <text>% 在此处添加描述文本</text> <code>% 在此处添加 MATLAB 代码</code> </section> </content> </document>""" # 写入文件 with open(os.path.join(mlx_dir, 'document.xml'), 'w') as f: f.write(doc_xml) # 创建 ZIP 压缩包 (.mlx) with zipfile.ZipFile(output_path, 'w') as zipf: for root, _, files in os.walk(tmpdir): for file in files: file_path = os.path.join(root, file) arcname = os.path.relpath(file_path, tmpdir) zipf.write(file_path, arcname) # 示例用法 create_mlx('new_script.mlx', title="数据分析脚本", author="Python程序生成") ``` ### 添加代码和文本内容 ```python def add_content_to_mlx(mlx_path, text_content, code_content): """向 .mlx 文件添加文本和代码""" with tempfile.TemporaryDirectory() as tmpdir: # 解压现有 .mlx 文件 with zipfile.ZipFile(mlx_path, 'r') as zip_ref: zip_ref.extractall(tmpdir) # 修改 document.xml doc_path = os.path.join(tmpdir, 'matlab', 'document.xml') tree = ET.parse(doc_path) root = tree.getroot() # 创建新内容节点 ns = {'m': 'http://schemas.mathworks.com/matlab'} section = ET.SubElement(root, '{http://schemas.mathworks.com/matlab}section') # 添加文本 text_elem = ET.SubElement(section, '{http://schemas.mathworks.com/matlab}text') text_elem.text = text_content # 添加代码 code_elem = ET.SubElement(section, '{http://schemas.mathworks.com/matlab}code') code_elem.text = code_content # 保存修改 tree.write(doc_path, encoding='utf-8', xml_declaration=True) # 重新压缩为 .mlx with zipfile.ZipFile(mlx_path, 'w') as zipf: for root, _, files in os.walk(tmpdir): for file in files: file_path = os.path.join(root, file) arcname = os.path.relpath(file_path, tmpdir) zipf.write(file_path, arcname) # 示例用法 add_content_to_mlx( 'new_script.mlx', text_content="% 本脚本由Python自动生成\n% 执行数据分析任务", code_content="data = readtable('dataset.csv');\nsummary(data);" ) ``` ## 4. 重要注意事项 1. **XML 命名空间处理**: - 所有操作都需要正确处理 XML 命名空间 - 使用完整命名空间 URI 或注册前缀 2. **内容格式限制**: - 文本中特殊字符需转义(如 `<` → `<`, `>` → `>`) - 代码块需放在 `<m:code>` 元素内 3. **MATLAB 兼容性**: - 不同 MATLAB 版本可能使用不同的 .mlx 格式 - 建议在目标 MATLAB 版本中测试生成的文件 4. **替代方案**: - 使用 MATLAB Engine API 直接执行 MATLAB 代码 ```python import matlab.engine eng = matlab.engine.start_matlab() eng.eval("disp('Hello from MATLAB')", nargout=0) ``` ## 5. 实际应用场景 1. **自动化报告生成**: ```python def generate_report(data): # Python 数据分析 analysis = analyze_data(data) # 创建带结果的 .mlx create_mlx('report.mlx', text_content=f"分析日期: {datetime.now()}\n结果摘要: {analysis['summary']}", code_content=analysis['matlab_code']) ``` 2. **MATLAB 代码移植**: ```python def convert_m_to_mlx(m_file_path, mlx_output): # 读取 .m 文件 with open(m_file_path, 'r') as f: code = f.read() # 转换为 .mlx create_mlx(mlx_output, code_content=code) ``` 3. **批量处理脚本**: ```python def batch_convert_mlx(folder): for file in os.listdir(folder): if file.endswith('.mlx'): content = read_mlx(os.path.join(folder, file)) # 处理内容... ``` ## 相关问题 1. 如何将 Python 数据分析结果直接嵌入 .mlx 文件的可视化中? 2. .mlx 文件中的图像资源如何用 Python 提取和修改? 3. MATLAB Engine API 在 Python 中的最佳实践是什么? 4. 如何处理 .mlx 文件中的 LaTeX 数学公式?$$ e^{i\pi} + 1 = 0 $$ 5. Python 如何与 MATLAB 的深度学习框架(如 VGG16[^2])交互? [^1]: MATLAB03:数据类型与文件读写 [^2]: 本文利用MATLAB R2018b来使用卷积神经网络VGG16来提取图像特征
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值