图像缩略图

xml2struct

版本1.8.0.0(2.94 KB)由 沃特Falkena
将xml文件转换为MATLAB结构,以便轻松访问数据。

289下载

更新2012年5月15

查看许可协议

将xml文件转换为MATLAB结构,以便轻松访问数据。

引用作为

Wouter Falkena (2020)。xml2struct(//www.tianjin-qmedu.com/matlabcentral/fileexchange/28518-xml2struct),MATLAB中央文件交换。检索

评论和评分(165)

陈望

尼斯的工作!

是什么人!我注意到我们已经有了一些解决上述“内存不足”问题的解决方案。万博 尤文图斯我通过在python中实现类似的代码来绕过这个问题。这可能会帮助一些人。遵循下面的代码:

###导入库
进口xml.etree.ElementTree为ET
导入numpy的为NP
进口scipy.io为间谍

xmltools类定义
类xmltools ():
“””
2020.04
@author:Laio Marinheiro
组织XML数据的结构,Python字典(这是annalogous一个matlab的
结构体)。这是受到xml2struct的启发。matlab的m。
这也使用
“””

def LoadXML(自我,xml_filename):

xml_tree = ET.parse(xml_filename)
xml_root = xml_tree.getroot()
返回xml_root

高清ChildProp(个体经营,父):

每个孩子的CHILD_NAME = []#名称
unique_child_names =[] #子元素的唯一名称
child_len ={} #每个子元素的长度(每个子元素的子元素个数)
child_idx ={} #父节点上的子节点索引
K = 0
对于孩子家长:
child_name.append (child.tag)
child_len [child.tag] = LEN(子)#不相干= /
child_idx[孩子。标记]= k
如果child.tag不unique_child_names:
unique_child_names.append(child.tag)
k = k + 1
对于unique_child_names中的unique_name:
k = 1时
在CHILD_NAME名称:
如果名称== UNIQUE_NAME:
child_len [unique_name] = k
k = k + 1
ChildProp = {}
ChildProp [ '名称'] = CHILD_NAME
ChildProp [' unique_names '] = unique_child_names
ChildProp [ 'len个'] = child_len
ChildProp [ '指数'] = child_idx
返回ChildProp

高清GetDict(个体经营,父):
字典= {}
如果len(父)== 0:#父是最后一个字段
如果parent.text不是无:
字典[ '文本'] = parent.text
其他:
Dict['Text'] = " #空字符串
else: #如果父节点不是最后一个,它有子节点
childprop = toolbox.ChildProp(父)
如果len(parent) == len(childprop['index']): # children是struct字段
对于孩子家长:
Dict[孩子。标记]= self.GetDict(孩子)
其他:#儿童是列表的元素(或清单)
unique_names =列表(childprop(“指数”). keys ())
用于unique_names: #中的list_name,用于每个列表
((childprop['len'][list_name],), dtype = np.object)
K = 0
对于孩子家长:
如果child.tag == LIST_NAME:
字典[LIST_NAME] [K] = self.GetDict(子)
k = k + 1
如果父母。鲜明! = {}:
字典[ '属性'] = parent.attrib
返回快译通

高清Dict2Mat(个体经营,xml_filename,字典):
spy.savemat(xml_filename [0:-4] + '垫。',汉语词典= { 'pythonxml':字典})

def xml2struct(自我,xml_filename):
xml_root = self.LoadXML(xml_filename)
xml_dict = {xml_root.tag:{}}
xml_dict [xml_root.tag] = self.GetDict(xml_root)
self.Dict2Mat (xml_filename xml_dict)

###实施例
工具箱= xmltools ()
xml_filename_str = 'your_filename.xml'
toolbox.xml2struct(xml_filename_str)

谢谢!

Aryaa R

这何

svanimisetti

CEM波拉特

EMMANOUIL

EMMANOUIL

瓦列里·

拉电脑

萨科

MathWorks公司相比功能更好!

它的工作原理,并且容易使用!

工作开箱的。

谢谢!!!

伟大的工作!谢谢你!

邓勃

在哪里可以找到xml2struct的输出文件

焦阳

强大的和准确的

Kiarash阿希

我想知道是否有类似于这个脚本的python版本?

凯雷姆Pekergin

Raj裁缝

练听力胡

做得好!

tanfeng

谢谢!

心汤

好东西!非常感谢!

nealm

此功能完美!非常非常感谢你!

虚电路

伟大的工作!谢谢

作品完美的我来说,这是前人的精力MATLAB的一部分

亚当张

毛罗

应该是MATLAB的一部分吗

米德

精美的作品和强劲。
尼斯的工作,谢谢!

一个国王

超级。伟大的工作。

好了!正是我要找的!

不错的功能。谢谢你!

马克西姆的Sich

威廉R

尼斯提交!

我的建议是,除去线137,138和139:
NAME = matlab.lang.makeValidName(名称);

此MATLAB的功能将确保所有无效Matlab的名字用下划线代替。

Konst Apost

尼斯,默认情况下应包含在MATLAB。

张天

郑邱

菲利普Glira

NenaV

似乎运作良好 - 只是想知道如何再次拯救结构传回的XML?我找不到这个在评论中提到。

斯文马丁

修改XML文件非常有用

M.Abuasbeh

朱利安Hapke

真正有用的脚本,而是缓慢的大个XML时,xmlread只用总时间的1/10。
改善我的想法:
更改
如果(~ isempty (regexprep(文本。(textflag), [\ s] *,)))

如果所有的〜(isspace为(文字。(textflag)))
并获得因子2的总加速(在我的测试情况下,至少)

Alexey R。

谢谢你这么多!

非常感谢,伟大的工作

天龙马

谢谢

我不得不作出一些修改,让我的XML文件的工作。我会把他们的下方,但因为这是使用此文件类型我的第一次,可能会有所不同。

第95行是截至2017年3月7日的版本

儿童(名称)=文本。

这改写这一切的那存储在其中的数据的子节点,因为最后一个节点被解析为注释(即它只包含一个字符串)。其他节点包含持有一个字符串值的数值。这里是我的解决办法:

如果isfield(文本, '文本')
孩子。(名字)= str2num (text.Text);
其他
。儿童(名称)( '注释')= text.Comment。
结束

总的来说非常有用,这正是我在添加替换行之后所需要的。

谢谢!

Yifei王

那很棒!!!非常感谢!!!

Hasenearl

ChrisDz

这是一个非常有用的脚本!我用它来读取AUTOSAR XML文件!在阅读AR-XML文件时,我发现了两个难题:
1.长替换文本为{'-'|':'|'。'}在xml标记中导致的问题是,matlab字段名将变得比63字符长!我将它们简化为{'_'|'c'|'d'}!帮助!
2.在XML注释的情况下<! - 注释 - >要在XML的文件中的脚本失败内部使用!我修复了这个问题!看看它!

替换:在函数内部:parseChildNodes(...)
%CDZ 2016年12月21日注释掉由于与问题
%XML-评论
如果%(〜的isEmpty(字段名(文本)))
%的儿童(名称){索引} =文本。
%结束

%CDZ 2016年12月21日增加了处理XML - 评论
如果(〜的isEmpty(文本)&& isstruct(文本))
如果发现(STRCMP(字段名(文本), '文本'))
。儿童(名称){索引}( '文本')= text.Text。
elseif找到(strcmp(字段名(文本),“评论”))
孩子。(名字){指数}。(“评论”)= text.Comment;
结束
结束

% CDz 2016-12-21由于问题被注释掉
%XML-评论
% if(~isempty(text) && ~isempty(fieldnames(text))
% children.(名称)=文本;
%结束

%CDZ 2016年12月21日增加了处理XML - 评论
如果(〜的isEmpty(文本)&& isstruct(文本))
如果发现(STRCMP(字段名(文本), '文本'))
。儿童(名称)( '文本')= text.Text。
elseif找到(strcmp(字段名(文本),“评论”))
。儿童(名称)( '注释')= text.Comment。
结束
结束

@沃特Falkena:如果你是interestd我可以为您提供该文件的完整副本,你可以更新这个脚本

做得好

简单,非常有用。非常方便。

我是一名博士生,我需要在我的代码应用此函数来获取XML文件的属性

迈克Wehr

工作好了!尝试xml_toolbox,但是它在2014年就坏了。这是一个可靠的替代品。

我需要编辑一个xml文件

CYÿ

我已经通过了问题,实施修复望去,增加了一些新功能的脚本,并在这里上传吧://www.tianjin-qmedu.com/matlabcentral/fileexchange/58700-xml2struct。也请尝试我的更新版本,让我知道如果它现在工作得更好。

Anael

尼尔的方法对我不起作用……

Anael

不能开箱即用。Stephane的方法非常有效!
也同样的问题塞巴斯蒂安有关意见和头。

基斯钩子

我收到“java.lang.OutOfMemoryError:GC开销超限”试图打开一个汉字字典文件时 -http://www.edrdg.org/kanjidic/kanjidic2.xml.gz

Anael

好,但对于大的XML文件相当缓慢。

卡兰吉尔

约阿夫

丹尼尔

你能更新代码吗?我也有同样的问题。

RONAK科斯

感谢这个非常灵活的脚本!顶!

策普

这正是我要找的东西。

丹尼尔

谢谢Wouter,

我不是很感激你的回答。问题现在解决了。如果有人有同样的问题,我可以上传代码。

斯特凡

嗨,

发现一个错误:当有文字和孩子在同一个节点,该文本将覆盖儿童。

固定:
更换

如果(〜的isEmpty(字段名(文本)))
孩子。(名字){指数}=文本;
结束

通过:

如果isstruct(文本)
为FLD =字段名(文本)”
儿童(名称){索引}(FLD {1})=文本(FLD {1})。。。;
结束
结束

而同时更换:

如果(〜的isEmpty(文本)&&〜的isEmpty(字段名(文本)))
儿童(名称)=文本。
结束

通过:

如果isstruct(文本)
为FLD =字段名(文本)”
孩子。(名字)。(盛名{1})=文本。(盛名{1});
结束
结束

谢谢。

superaga

简单的使用和伟大的工作!!谢谢分享。

MOI

一个

运行较大的xml需要很长的时间。在代码的任何地方,我可以等待酒吧至少报告的进展给用户?我尝试了两个for循环,但这似乎不是瓶颈。

约尔格

凯文

非常简单的使用和它的工作。

亚历克斯

“安德鲁·威尔逊:从奥尼尔魏斯在前面的评论的修复/审查似乎解决这个问题,所以这将是伟大的看到,纳入更新!”感谢安德鲁·威尔逊

大部分的伟大工程,但节点的问题丢失发表评论时,出现在层次结构的同一级别是相当令人沮丧。从奥尼尔魏斯在前面的评论/查看修复似乎解决这个问题,所以这将是伟大的看到,纳入更新!

似乎除了所报告的塞巴斯蒂安·罗伊在14年9月10日,做工精细 - XML注释不工作(导致其他数据的丢失)

今天晚上来处理一些XML数据下载该文件。工作只是罚款。

伯纳德

对不起,粘贴错了。
这里是能解决问题,我行154:

文本。(textflag) = char (getTextContent (theNode));

伯纳德

好东西。

至于说“未定义功能‘toCharArray’类型的‘双师型’输入参数。”错误:

对于我来说,努力改变管线154到
。文本(textflag)= CHAR(的getData(theNode))';
就像在xml2struct的早期版本中一样(在第153行代码的注释中提到)

与直接使用xmlread相比,这节省了大量时间。但是,当出现文本时,子节点存在一个错误。子节点内容将被设置为文本,子节点的所有其他内容将丢失。注释作为文本处理,也会导致同样的问题。试图读取此xml将不会提供预期的结果:

<?XML版本= “1.0” 编码= “UTF-8”?>

<根>
< !——应该是一个良性的评论——>
<的MyStuff>有价值的数据
根> < /

一些XML文件中的属性的开头哪个错误,因为不允许的字段名称有下划线。简单strrep解决了这个问题。

太棒了!

Timo Dorsam

使用XML和使用json.org/java [1]静态XML.toJSONObject()方法[2],有一个在我的收存箱[3]的预编译jar文件或使用牛顿国王JSON.NET停止[4]这是已经通过预编译他和从CodePlex上[5]只需下载并解压,然后使用的版本为您的机器上的.NET框架。XML和JSON之间进行转换的文档[6]和在该SO交[7]中描述。见MATLAB文档的详细信息,在MATLAB使用Java [8]或.NET [9]。这是超级简单!
[1]http://json.org/java/
[2](http://json.org/javadoc/org/json/XML.html#toJSONObject(java.lang.String))
[3]https://dl.dropboxusercontent.com/u/19049582/JSON.jar
[4]http://james.newtonking.com/pages/json-net.aspx
[5]https://json.codeplex.com/
[6]http://james.newtonking.com/projects/json/help/index.html?topic=html/ConvertingJSONandXML.htm
[7]http://stackoverflow.com/a/814027/1020470
[8]//www.tianjin-qmedu.com/help/matlab/using-java-libraries-in-matlab.html
[9]//www.tianjin-qmedu.com/help/matlab/using-net-libraries-in-matlab.html

我已经看到了一些其他用户报告这一问题,但无法找到如何解决此问题:

未定义功能“toCharArray”类型“双”的输入参数。

任何想法?

问候

Varoujan

工作得很好。
没有充分测试的空场情况下,像一些评论,但我得到了一个很好的结构,我的输入文件。

我感到失望的是类似的功能是不是建立在Matlab。单独xmlread和xmlwrite是这样的疼痛,以访问和/或更新的XML数据。

亚当

嗨,
感谢您的文件,它的伟大工程。
但我也有同样的问题,因为埃里克空数据字段。有人知道如何解决这一问题?

比xml_read更快,推荐!

埃里克

感谢您的文件,但是我在与空数据字段的问题。

如果我有一个100x50的XML数据集,我可以很容易地导入到Excel中。然而,有一些字段是空的。例如,在(5,35:40)处,XML数据是空的。

当我使用xml2struct,然后尝试,并创建以相同的格式的单元阵列(100x50)40:50之间在5行中的数据,转移到35:45的位置和我留下5个的空的空间从45:50并且这样的数据被对准。

如何才能保持自己的原始文件位置处理空字段的任何想法?

谢谢!

我只是想知道是否有人能确认我做的是正确的。当我想把xml转换成matlab数组时,我输入:
data=xml2struct('要转换的文件的名称');吗?这是所有吗?

我们遇到了Raoul Herzog报告的相同问题:对于类型为“double”的输入参数,未定义函数或方法“toCharArray”。有什么解决办法吗?

对于评论错误@Sirius3,我改变了以下代码块:

如果(〜STRCMP(名字, '#文本')&&〜STRCMP(名字, '#注释')&&〜STRCMP(名称, '#cdata_dash_section'))
%XML允许相同的元素被定义多次,
把每一个放在不同的单元格中
如果(isfield(儿童,名))
如果(〜iscell(孩子。(名)))
将存在元素放入单元格式中
儿童(名称)= {儿童(名称)。}。
结束
指数=长度(孩子。(名字))+ 1;
%添加新元素
儿童(名称){索引} =儿童的。
如果(〜的isEmpty(字段名(文本)))
孩子。(名字){指数}=文本;
结束
如果(〜的isEmpty(ATTR))
孩子。(名字){指数}。(“属性”)= attr;
结束
其他
%前所未知的(新)元素添加到结构
孩子。(名)=蔡尔兹;
如果(〜的isEmpty(文本)&&〜的isEmpty(字段名(文本)))
儿童(名称)=文本。
结束
如果(〜的isEmpty(ATTR))
儿(名称)( '属性')=属性。;
结束
结束
其他

如果(〜STRCMP(名字, '#文本')&&〜STRCMP(名字, '#注释')&&〜STRCMP(名称, '#cdata_dash_section'))
%XML允许相同的元素被定义多次,
把每一个放在不同的单元格中
如果(isfield(儿童,名))
如果(〜iscell(孩子。(名)))
将存在元素放入单元格式中
儿童(名称)= {儿童(名称)。}。
结束
指数=长度(孩子。(名字))+ 1;
%添加新元素
儿童(名称){索引} =儿童的。
textFieldNames =字段名(文本);
对于t = 1:长度(textFieldNames)
textFieldName = textFieldNames {吨};
儿童(名称){索引}(textFieldName)=文本(textFieldName)。;
结束
如果(〜的isEmpty(ATTR))
孩子。(名字){指数}。(“属性”)= attr;
结束
其他
%前所未知的(新)元素添加到结构
孩子。(名)=蔡尔兹;
如果(〜的isEmpty(文本)&&〜的isEmpty(字段名(文本)))
textFieldNames =字段名(文本);
numTextFieldNames =长度(textFieldNames);
对于i = 1:numTextFieldNames
thisFieldName = textFieldNames {};
孩子。(名字)。(thisFieldName) =文本。(thisFieldName);
结束
结束
如果(〜的isEmpty(ATTR))
儿(名称)( '属性')=属性。;
结束
结束
其他

现在,当一个注释被解析的孩子。(名称)属性没有吹走。

Sirius3

错误:子节点迷路,当它们之间存在着意见。(线95)

Gledi

首先感谢优秀的代码。
我根据小区有一个“小”问题。在你的代码,如果比你创建一个单元格,否则不会有更多的不止一个孩子。我应该改变有情况:即使结点只有一个孩子比我创建了一个单元(一个元素)

马修

工作对我非常好。非常感谢。

xml2struct中似乎有一个错误:
如果需要,我可以为你提供相应的XML文件。

???类型为“double”的输入参数的未定义函数或方法“toCharArray”。

误差在==> xml2struct> parseAttributes在174
STR = toCharArray(的toString(项目(theAttributes,计数-1)))';

误差在==> xml2struct> getNodeData在141
attr = parseAttributes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

误差在==> xml2struct> getNodeData在147
[蔡尔兹、文本textflag] = parseChildNodes (theNode);

错误在==> xml2struct>parseChildNodes at 72
[文本、名字、attr,孩子,textflag] = getNodeData(育);

错误的==>在57 xml2struct
S = parseChildNodes(XDOC);

小虎

其中一个是我个人遇到的问题是,xml2struct不能处理CDATA块。

它可以很容易固定,替换为67行:
如果(〜STRCMP(名字, '#文本')&&〜STRCMP(名字, '#注释')&&〜STRCMP(名称, '#cdata_dash_section'))
和线94与:
(strcmp(name,'#text') || strcmp(name,'# cdata_dash_section'))

否则效果很好,谢谢。

阿里

太好了!我拉着头发从XML文件中读取数字,只用了一分钟

对于小文件非常有用。我测试了一些包含>100000条目的较大文件,这大约需要178秒。

布莱德

沃特Falkena

谢谢你的建议,万纳先生。我已经更新了文件,目前正在MATLAB Central审核中。它很快就会出现在这里。

谢谢你的工作。
您可能希望通过以下方法替换第152-154行,从而将属性解析速度提高约40%:
str = theAttributes.item(把1).toString.toCharArray () ';
k = strfind (str, ' = ');
attr_name = regexprep(STR(1:(K(1)-1)), '[ - :.]', '_');
属性。(attr_name) = str (k (1) + (2): (end-1));

标记

谢谢,您的汽车领域的命名系统为我工作的伟大的工作,从XML文件解析出数据。

伯纳德

谢谢!我最后遇到了一个工具,它可以从一个ISO19115/19139 xml文件中提取信息。

简单,工作得很好!该结构是一个有点冗长,但他们应该是通过我的节目无论如何分析;任何企图瓦解一些嵌套结构的只会减慢代码(有些类似意见做到这一点,但很慢)。谢谢!

由于诉了!我用它来读取的Collada文件(几何文件谷歌素描时)。工作就像一个魅力!

沃特Falkena

你是正确的。我已经删除了'。xml的扩展assumption, unless the file can not be found. The update file is currently under review by MATLAB Central and should appear here soon.

马蒂厄

警告:所有XML文件都没有'。xml的扩展

乔安妮

第一次尝试加载OSM数据文件。

TideMan

我被撕裂我的头发试图找出如何自动访问一个.xml文件中一个很小的部分数据的,直到我发现这个程序。

柳井

更新

1.8.0.0

修正了CDATA和注释结构字段中的小错误。

1.7.0.0

由于十莫速度的提升和CDATA和添加注释的支持。万博1manbetx

1.5.0.0

该功能现在替换包含的元素和属性名 - 由_dash_。通过_dot_和:通过_colon_

1.4.0.0

属性解析速度提高了40%

1.3.0.0

修改上传文件

1.2.0.0

删除了假设的文件名应该有一个“.XML”延伸

1.1.0.0

减少的处理时间大量的XML文件