将XML文件转换为MATLAB结构,以便于访问数据。
Wouter Falkena(2021)。xml2struct(//www.tatmou.com/matlabcentral/fileexchange/28518-xml2struct), MATLAB中央文件交换。检索.
启发:气象天气API连接器,从谷歌Maps下载海拔高度(需要API密钥),XML2STRUCT,具有错误修复和添加功能,acampb311 / xml2struct,maxsisch / loadspe.,显微镜图像浏览器(MIB),显微镜图像浏览器2,prowlpush: MATLAB的潜行通知,徒手前列诠释,colladaParser
你好。
为什么我继续收到这个错误“XML2STRUCT”用于大型多分辨率图像的深度学习分类。“?
谢谢!
救命稻草!
它真的很快!
我一直在使用这个大代码很长一段时间,但现在看到以下XML没有正确解析:http://www.steinheim-institut.de:80/cgi-bin/epidat?id=ad2-179-tip5.,但只导入第一个。。注释被导入,但是没有被导入。
例如TEI。Facsimile包含两个子元素
TEI.teiHeader.profileDesc在注释后包含两个子句
在tei .text.body.div中,没有一个
子元素被导入。
谢谢。非常方便。
要从url中读取,请在第38行和第39行之间添加此内容。
elsefif包含(fiile,'http')
xdoc = xmlread(文件);
完美!
好了!
好工作!
怎么了笨蛋!我注意到我们已经有一些解决方案的“空中内存”错误上面所例句。金宝搏官方网站嗯,我设法通过在Python中实现类似的代码来解决这个问题。这可能有助于某人。代码如下:
# # #进口填词
导入XML.ETREE.ELEMENTTREE等
将numpy导入np
进口scipy。io是间谍
### XMLTools类定义
class xmltools():
'''
2020.04
@author: Laio Marinheiro
将XML数据结构组织为Python Dict(这是Matlab的Annalogous
结构)。这在Matlab中的XML2STRUCT.M中启发了这一点。
这也使用
'''
def LoadXML(自我,xml_filename):
xml_tree = et.parse(xml_filename)
xml_root = xml_tree.getroot()
返回xml_root.
def ChildProp(自我、父母):
child_name = []#每个孩子的名称
unique_child_names = []#唯一的孩子姓名
Child_len ={} #每个子节点的长度(每个子节点的子节点数)
child_idx = {}#父母的#index
k = 0
父母的孩子:
child_name.append (child.tag)
child_len [child.tag] = len(child)#unlelevant = /
child_idx[孩子。标记]= k
如果child.ag不包含unique_child_names:
unique_child_names.append (child.tag)
k = k + 1
for unique_child_name中的unique_name:
k = 1
For name in child_name:
如果name == unique_name:
child_len [unique_name] = k
k = k + 1
childprop = {}
childprop ['names'] = child_name
ChildProp [' unique_names '] = unique_child_names
childprop ['len'] = child_len
childprop ['index'] = child_idx
返回ChildProp
def GetDict(自我、父母):
Dict = {}
如果len(父级)== 0:#父是最后一个字段
如果父母。文本不是None:
dict ['text'] = parent.text
其他:
dict ['text'] =''#空字符串
Else: #如果parent不是最后一个,那么它有子节点
childprop = toolbox.childprop(父级)
如果len(父级)== len(childprop ['index']):#孩子是struct字段
父母的孩子:
dict [child.tag] = self.getdict(孩子)
否则:#儿童是列表(或列表)的元素
unique_names = list(childprop ['index']。keys())
对于unique_names中的list_name:#每个列表
dict [list_name] = np.zeros((childprop ['len'] [list_name],),dtype = np.object)
k = 0
父母的孩子:
如果孩子。标签= = list_name:
Dict [list_name] [k] = self.GetDict(孩子)
k = k + 1
如果parent.attrib!= {}:
dict ['属性'] = parent.attrib
返回Dict类型
def Dict2Mat(自我、xml_filename字典):
spy.savemat(xml_filename [0:-4] +'。mat',mdict = {'pythonxml':字典})
def xml2struct(self,xml_filename):
xml_root = self.LoadXML (xml_filename)
xml_dict = {xml_root.tag: {}}
xml_dict [xml_root。标记]= self.GetDict (xml_root)
self.dict2mat(xml_filename,xml_dict)
###示例
工具箱= xmltools ()
xml_filename_str ='your_filename.xml'
Toolbox.xml2struct(XML_FILENAME_STR)
谢谢!
比MathWorks功能更好!
它工作,并且很容易使用!
直接从盒子里工作。
谢谢你! !
伟大的工作!谢谢
我在哪里可以找到xml2struct的输出文件
强大,准确
我想知道是否有类似于这个脚本的python版本?
做得好!
谢谢!
伟大的东西!谢谢!
这个函数工作得很完美!非常非常感谢!
伟大的工作!谢谢
适合我,这可能是Matlab的一部分
应该是MATLAB的一部分
工作漂亮和健壮。
干得好,谢谢!
超级。伟大的工作。
好了!正是我正在寻找的!
不错的功能。谢谢你!
好提交!
我的建议是删除第137、138和139行:
name = matlab.lang.makeValidName(名称);
此MATLAB函数将确保所有没有有效的MATLAB名称替换为下划线。
很好,应该默认包含在matlab中。
似乎正在运作良好 - 只是想知道如何将结构保存回XML?我找不到评论中提到的这一点。
非常有用,可修改XML文件
真正有用的脚本,但在大XML上慢慢,XMLREAD仅在整个时间的1/10中使用。
我的改进理念:
改变
if(〜isempty(regexprep(textflag),'[\ s] *',''))))
到目前为止
如果〜所有(ISSPACE(文本))
并获得因子2的总体加速(至少在我的测试用例中)
非常感谢你!
非常感谢,干得好
谢谢
我不得不进行一些修改来让我的XML文件工作。我会把它们放在下面,但由于这是我第一次使用此文件类型,里程可能会有所不同。
截至2017年7月3日,当前版本中的第95行
孩子们。(姓名)=文本;
覆盖具有存储在其中的数据的所有子节点,因为要解析的最后一个节点是注释(即它仅包含一个字符串)。其他节点包含作为字符串值保持的数值。这是我的修复:
如果isfield(文本、文本)
孩子们。(姓名)= str2num(text.text);
别的
孩子。(名字)。(“评论”)= text.Comment;
结束
总体非常有帮助,并且在我把替换线路置于替换线后,这正是我需要的。
谢谢!
那很棒!非常感谢!!!
这是一个非常有用的脚本!我用它来读取AUTOSAR XML文件!在阅读AR-XML文件时,我发现了两个挑战:
1.{'-'|':'|'的长替换文本。'}将导致问题,matlab字段名将变得超过63个字符!我将它们简化为{'_'|'c'|'d'}!帮助!
2.在XML注释<! - 注释 - >在XML文件中使用脚本失败!我修复了这个问题!看看它!
替换:在功能内:ParseChildNodes(...)
百分比CDZ 2016-12-21因问题而注释出来
% xml注释
%if(〜isempty(fieldnames(text))))
%儿童。(姓名){index} =文本;
%结束
%CDZ 2016-12-21添加以处理XML - 评论
if(〜isempty(text)&& isstruct(text))
如果找到(strcmp(timeNames(text),'text'))
孩子。(名字){指数}。('文本')= text.Text;
elseif找到(strcmp(字段名(文本),“评论”))
孩子。(名字){指数}。(“评论”)= text.Comment;
结束
结束
和
百分比CDZ 2016-12-21因问题而注释出来
% xml注释
% if(~isempty(text) && ~isempty(fieldnames(text)))
%儿童。(姓名)=文本;
%结束
%CDZ 2016-12-21添加以处理XML - 评论
if(〜isempty(text)&& isstruct(text))
如果找到(strcmp(timeNames(text),'text'))
孩子。(名字)。('文本')= text.Text;
elseif找到(strcmp(字段名(文本),“评论”))
孩子。(名字)。(“评论”)= text.Comment;
结束
结束
@ Wouter Falkena:如果你感兴趣,我可以提供这个文件的完整副本,你可以更新这个脚本
做得好
简单而实用。非常方便。
我是一名博士生,我需要在我的代码上应用这个函数来获得XML文件的属性
工作好了!尝试过xml_toolbox,但是从2014年开始就坏了。这是一个坚实的替代品。
我需要编辑XML文件
我查看了问题,执行了修复,添加了一些新功能的脚本,并上传了它在这里:https://www.mathwands.com/matlabcentral/fileexchange/58700-xml2struct..请尝试我的更新版本,并告诉我它是否正常工作。
尼尔的药对我不起作用。
不可能开箱即用。Stéphane的修复工作很棒!
关于评论和标题的Sebastien也是同样的问题。
我收到了一个“java.lang.outofmormoryError:尝试打开Kanji字典文件时超出了GC架空限制 -http://www.edrdg.org/kanjidic/kanjidic2.xml.gz.
很好,但对于大型XML文件而慢。
丹尼尔
你能更新代码吗?我有同样的问题。
谢谢你这个非常灵活的剧本!顶!
这正是我想要的。
谢谢Wouter,
这不是很欣赏你的回应。现在解决了这一问题。如果有人有同样的问题,我可以上传代码。
你好,
发现一个bug:当同一节点中有文本和子节点时,文本会覆盖子节点。
解决办法:
替换
if(〜isempty(fieldnames(text))))
孩子们。(姓名){index} =文本;
结束
通过:
如果是isstruct(文本)
对于FLD = FieldNames(文本)'
儿童。(名称){index}。(FLD {1})=文本。(FLD {1});
结束
结束
也和替换:
if(〜isempty(文本)&&〜isempty(fieldnames(text)))
孩子们。(姓名)=文本;
结束
通过:
如果是isstruct(文本)
对于FLD = FieldNames(文本)'
孩子。(名字)。(盛名{1})=文本。(盛名{1});
结束
结束
谢谢。
简单的使用和工作伟大!!谢谢分享。
运行较大的xml需要很长时间。代码中是否有一个等待栏,让我至少向用户报告进度?我尝试了两个for循环,但这似乎不是瓶颈。
非常简单的使用和它的工作。
“Andrew Wilson:在早期的评论/评论中,Neill Weiss的修复似乎解决了这一点,所以很高兴看到它融入更新!”谢谢和威尔逊
在大多数情况下工作得很好,但是当注释出现在层次结构的同一层时,节点丢失的问题非常令人沮丧。尼尔·韦斯(Neill Weiss)在早些时候的评论/评论中修复的问题似乎解决了这个问题,所以如果能将其纳入到更新中就太好了!
似乎工作正常,除非Sebastien Roy于09/10/14 - XML评论不起作用(导致其他数据丢失)
今天晚上下载了这个文件来处理一些XML数据。工作得很好。
对不起,粘贴错误的线条。
这是第154行,为我修复了问题:
文本。(textflag) = char (getTextContent (theNode));
好东西。
关于“Double”类型的输入参数的“未定义函数”tochararray“。错误:
对我来说,把154行改成
文字。(textflag)= char(getData(theode))';
因为它已经在早期版本的XML2STRUCT(在第153行中的代码中的注释中提到)
与直接使用xmlread相比,节省了大量时间。但是,当存在文本时,子节点有一个错误。子节点内容将被设置为文本,子节点的所有其他内容将丢失。作为文本处理的注释也会导致同样的问题。尝试读取这个xml将不会提供预期的结果:
<?XML Version =“1.0”编码=“UTF-8”?>
<! - 应该是一个良性的评论 - >
< mystuff >有价值的数据< / mystuff >
根> < /
XML文件中的一些属性在开头时具有下划线,因为不允许的字段名称出错。简单的strep解决了这个问题。
太棒了!
优秀
停止使用XML并使用json.org/java [1]静态XML.tojsonObject()方法[2],我的Dropbox中有一个预编译的jar文件[3]或使用牛顿国王的json.net [4]已经预先编译他和可从CodePlex中获得[5]只需下载和解压缩,然后使用计算机上的.NET Framework的版本。在文档[6]中描述了XML和JSON之间的转换,在此之后[7]。有关使用MATLAB中的Java [8]或.NET [9]的更多信息,请参阅MATLAB文档。它超级容易!
[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.tatmou.com/help/matlab/using-java-libraries-in-matlab.html.
[9]//www.tatmou.com/help/matlab/using-net-libraries-in-matlab.html.
我已经看到一些其他用户报告这个问题,但无法找到如何解决这个问题:
未定义函数'toCharArray'用于输入类型为'double'的参数。
任何想法?
问候
工作得很好。
没有完全测试像一些评论者那样的空现场案例,但我的输入文件有一个很好的结构。
我很失望的是,Matlab没有建立类似的功能。单独XMLREAD和XMLWRITE是访问和/或更新XML数据的疼痛。
你好,
谢谢你的文件,它很好用。
但我也是与空数据字段的Erik相同的问题。有人知道如何解决这个问题?
比xml_read快,推荐!
谢谢这个文件,但是我有一个空数据字段的问题。
如果我有一个100x50的XML数据集,我可以很容易地导入到Excel。然而,有几个字段是空的。例如,在(5,35:40)处,XML数据是空的。
当我使用xml2struct然后以相同的格式创建一个单元格数组(100x50)行5的数据在40:50之间的数据,转移到35:45位置,我留下了45:50的5个空白空间因此,数据未对准。
有关如何处理空字段的任何想法,以便在原始文件中保持其职位?
谢谢!
我只是想知道是否有人能证实我正在做的是正确的。当我想要将XML转换成matlab数组时,我输入:
Data =xml2struct('我想转换的文件的名称');?这是所有吗?
我们遇到了Raoul Herzog报告的相同问题:输入参数类型为double的函数或方法'toCharArray'未定义。有解决办法吗?
对于评论错误,@ sirius3,我从以下内容改变了以下代码块:
如果(~ strcmp(名称、“#文本”)& & ~比较字符串(名称、“#评论”)& & ~比较字符串(名字,' # cdata_dash_section '))
%XML允许多次定义相同的元素,
%将它们分别放在不同的单元格中
如果(isfield(孩子的名字))
如果(~ iscell(孩子。(名字)))
将存在的元素放入单元格格式
孩子。(名字)={孩子。(名)};
结束
指数=长度(孩子。(名字))+ 1;
%添加新的元素
孩子。(名字){指数}=蔡尔兹;
if(〜isempty(fieldnames(text))))
孩子们。(姓名){index} =文本;
结束
如果(〜isempty(attr))
孩子。(名字){指数}。(“属性”)= attr;
结束
别的
将先前未知的(新)元素添加到结构中
孩子。(名)=蔡尔兹;
if(〜isempty(文本)&&〜isempty(fieldnames(text)))
孩子们。(姓名)=文本;
结束
如果(〜isempty(attr))
孩子。(名字)。(“属性”)= attr;
结束
结束
别的
到目前为止
如果(~ strcmp(名称、“#文本”)& & ~比较字符串(名称、“#评论”)& & ~比较字符串(名字,' # cdata_dash_section '))
%XML允许多次定义相同的元素,
%将它们分别放在不同的单元格中
如果(isfield(孩子的名字))
如果(~ iscell(孩子。(名字)))
将存在的元素放入单元格格式
孩子。(名字)={孩子。(名)};
结束
指数=长度(孩子。(名字))+ 1;
%添加新的元素
孩子。(名字){指数}=蔡尔兹;
textFieldNames =字段名(文本);
对于t = 1:长度(TextFieldNames)
TextFieldName = TextFieldNames {T};
儿童。(名称){index}。(textFieldName)=文本。(TextFieldName);
结束
如果(〜isempty(attr))
孩子。(名字){指数}。(“属性”)= attr;
结束
别的
将先前未知的(新)元素添加到结构中
孩子。(名)=蔡尔兹;
if(〜isempty(文本)&&〜isempty(fieldnames(text)))
textFieldNames =字段名(文本);
numTextFieldNames = length(textFieldNames);
对于i = 1:numtext riffames
thisFieldName = textFieldNames {};
孩子。(名字)。(thisFieldName) =文本。(thisFieldName);
结束
结束
如果(〜isempty(attr))
孩子。(名字)。(“属性”)= attr;
结束
结束
别的
现在,孩子们。(姓名)在解析评论时不被吹走。
错误:当它们之间有评论时,子节点会丢失。(第95行)
首先,感谢出色的代码。
根据细胞,我有一个“小”问题。在您的代码中,如果在创建单元格中有多个孩子,否则不是。我应该如何更改案例:即使节点只有一个孩子,也只有一个小区(带一个元素)
对我来说非常好。非常感谢你。
xml2struct中似乎有一个错误:
如果需要,我可以提供相应的xml文件给你。
???用于输入“双”的输入参数的未定义功能或方法'tocharArray'。
==> xml2struct> acseattributes in 174中的错误
str = toCharArray (toString(项目(theAttributes,把1)))';
==> XML2STRUCT> GETNODEDADATAT 141
attr = parseattributes(hoseode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
==> XML2STRUCT> GETNODEDATA时出错147
[childs,text,textflag] = parsechildnodes(headode);
错误==> XML2STRUCT> PARSECHILDNODE 72
[文本,姓名,attr,childs,textflag] = getnodedata(thechild);
错误==> XML2在57处
s = parsechildnodes(xdoc);
我个人遇到的一个问题是xml2struct不能处理CDATA块。
它可以轻松修复,更换第67行:
如果(~ strcmp(名称、“#文本”)& & ~比较字符串(名称、“#评论”)& & ~比较字符串(名字,' # cdata_dash_section '))
和第94行:
Elseif (strcmp(name,'#text') || strcmp(name,'# cdata_dash_section'))
否则效果很好,谢谢。
优秀!我正在拉动我的头发从XML文件中读到数字,并且在此情况下我在一分钟内完成了
适用于小文件。我测试了一些更大的文件与>100000项,这需要178秒左右。
谢谢你这个建议Wanner先生。我已经更新了该文件,目前正在审查Matlab Central。它很快就会出现。
谢谢你的工作。
您可能希望通过替换第152-154行通过以下方式加快约40%的属性解析:
str = theattributes.item(count-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文件(几何文件谷歌sketchup)。真管用!
你是正确的。除非找不到文件,否则我已删除了“.xml”的扩展假设。Matlab Central目前正在审查更新文件,并应该很快出现。
警告:所有XML文件都没有“.xml”扩展
在第一次尝试加载OSM数据文件时工作。
我正在撕毁我的头发试图弄清楚如何在我找到这个例程之前自动访问.xml文件中的一个微小的数据。