通过Matlab设置具有相同标签的xml元素的值

时间:2016-07-26 21:45:27

标签: xml matlab

我有大型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>

1 个答案:

答案 0 :(得分:1)

我将对@ nirvana-msu的意思进行扩展,而不为您编写解决方案,因为这将非常繁琐。

>> xDoc = xmlread(fullfile(filename)); 
>> xRoot = xDoc.getDocumentElement() 
xRoot =
    [GTOMonteCarlo: null]

xRoot这是您的起点,即文档的根节点。

根节点与任何节点一样,都有子节点。在您的xml文件中,您可以看到GTOMonteCarlo的直接子项为STELAversionGTOInputParameters等。几乎。这些标记之间包含的空“文本”节点也是有效节点。访问节点后,请使用以下命令,直到找出正在进行的操作。

>> 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操作示例。

希望这能让你开始。祝你好运。