我有大型XML文件需要通过Matlab的Intent
设置一些值。不幸的是,它们具有相同的标签和结构,所以我只能到达第一个实例。具体来说,我需要分别更改每个xmlread
和<min>
标记的值。
xml文件的结构如下:
<max>
我现在使用的Matlab代码仅适用于标记的第一个实例。
<?xml version="1.0" encoding="utf-8"?>
<GTOMonteCarlo version="3.0.0">
<STELAVersion>3.0</STELAVersion>
<STELAVersion>3.0</STELAVersion>
<GTOInputParameters>
<AbstractInputParameters>
<MeanDeltaUniformParameters>
<UniformParameters>
<min>2.5</min>
<max>2.7</max>
</UniformParameters>
</MeanDeltaUniformParameters>
<MeanDeltaUniformParameters>
<UniformParameters>
<min>0.0217</min>
<max>0.0317</max>
</UniformParameters>
</MeanDeltaUniformParameters>
<MeanDeltaUniformParameters>
<UniformParameters>
<min>1.2</min>
<max>1.8</max>
</UniformParameters>
</MeanDeltaUniformParameters>
</AbstractInputParameters>
<MeanDeltaUniformParameters>
<UniformParameters>
<min>0.0217</min>
<max>0.0317</max>
</UniformParameters>
</MeanDeltaUniformParameters>
<MinMaxUniformParameters>
<UniformParameters>
<min>0.8</min>
<max>1.2</max>
</UniformParameters>
</MinMaxUniformParameters>
(...)
</GTOMonteCarlo>
答案 0 :(得分:1)
我将对@ nirvana-msu的意思进行扩展,而不为您编写解决方案,因为这将非常繁琐。
>> xDoc = xmlread(fullfile(filename));
>> xRoot = xDoc.getDocumentElement()
xRoot =
[GTOMonteCarlo: null]
xRoot
这是您的起点,即文档的根节点。
根节点与任何节点一样,都有子节点。在您的xml文件中,您可以看到GTOMonteCarlo
的直接子项为STELAversion
,GTOInputParameters
等。几乎。这些标记之间包含的空“文本”节点也是有效节点。访问节点后,请使用以下命令,直到找出正在进行的操作。
>> RootChildren = xRoot.getChildNodes()
RootChildren =
[GTOMonteCarlo: null] % not very informative, I agree.
% but trust me that this is now a list of nodes
>> RootChildren.getLength % How many DOM child elements does this list contain?
ans =
7 % 7! Great. Let's access them and inspect them
>> RootChildren.item(1) % get the first one
ans =
[STELAVersion: null] % hm ... that wasn't it. What's the next one?
>> RootChildren.item(2)
ans =
[#text: ] % that's not it either.
此时你应该意识到你需要进入的节点位于第5位。在我们的树中,我们有一个STELLAVersion节点,一个空文本节点,另一个STELLAVersion节点(由于某种原因不正确缩进,但无论如何),另一个空文本节点,然后我们到达你感兴趣的节点。所以它是名单上的孩子5。
>> RootChildren.item(5)
ans =
[GTOInputParameters: null] % bingo! Let's get this guy's children
>> GTOChildren = RootChildren.item(5).getChildNodes()
GTOChildren =
[GTOInputParameters: null]
>> GTOChildren.getLength
ans =
7
>> GTOChildren.item(1)
ans =
[AbstractInputParameters: null]
等等。
你应该找到一种方法来遍历节点及其子节点,直到你到达你感兴趣的节点,即'min'和'max'节点。
不幸的是,这些xml函数在很大程度上没有文档... 但如果在键入节点变量和点后按Tab键一次或两次(即“RootChildren。[TAB] [TAB]”)您将获得该类型节点(或节点列表)可用的所有功能的弹出列表,您可以使用它们并查看它们的作用;大多数人都有相当不言自明的名字。
其中一个例如是.getTextContent
。一旦你掌握了'min'节点,你将需要它来获得你的数值,即
MinNode.getTextContent
如果那是你任务的结束,太棒了!但是,如果事实上你正在尝试创建一个更新值的xml文件,正如我所理解的那样,请继续阅读。
我发现了一个.setTextContent
,如果您在设置了一个值之后,可能就是您所需要的。
不幸的是,您的节点不会更新其内容,就是这样。
您拥有的任何节点对象都只是内存中的一个独立变量。
因此,当您更新节点时,您必须调用ParentNode.replaceChild(NewChildNode, OldChildNode)
,并将所有这些子代替换回Root节点,这样您最终会有一个闪亮的新Root节点添加到您的xml文档中
幸运的是,虽然像replaceChild
这样的东西在matlab中没有记载,但可能它们直接对应于现有的javascript DOM函数,你可以在这里找到它们:http://www.w3schools.com/jsref/dom_obj_all.asp
(例如,replaceChild函数在这里:http://www.w3schools.com/jsref/met_node_replacechild.asp)
获得更新的Root节点后,将xDoc根节点替换为该节点,然后可以将xmlwrite
与新xDoc
一起使用,以写入新的xml文件。
请参阅xmlwrite
帮助以了解如何使用它,以及另一个简单的DOM操作示例。
希望这能让你开始。祝你好运。