【问题标题】:Modify an XML file with XPath in MATLAB在 MATLAB 中使用 XPath 修改 XML 文件
【发布时间】:2014-10-13 00:08:21
【问题描述】:

我正在尝试使用 XPath 在 MATLAB 中打开和修改 XML 文件。这是我到目前为止写的代码:

import javax.xml.xpath.*
doc = xmlread(which('myXMLfile.xml'));

factory = XPathFactory.newInstance();
xpath = factory.newXPath();
expr = xpath.compile('/data//parameter[@name=''MYPARAMETER'']/double');

nodeList = expr.evaluate(doc,XPathConstants.NODESET);
disp(char(nodeList.item(0).getFirstChild.getNodeValue))

nodeList.item(0).setNodeValue('0.03')

还有我的 XML 文件:

<data>
...
  <parameter name="MYPARAMETER">
    <double>0.05</double>
  </parameter>
...

disp 行在 MATLAB 命令行窗口中正确显示了值,这里是 0.05

脚本不会引发错误。但是,未在 XML 文件中设置 0.03 值。我做错了什么,为什么没有使用setNodeValue 命令将值写入文件?

编辑

按照建议,它可能不会被保存,因为它只是在内存中进行了修改。我在代码中添加了以下几行:

factory = javax.xml.transform.TransformerFactory.newInstance();
transformer = factory.newTransformer();

writer = java.io.StringWriter();
result = javax.xml.transform.stream.StreamResult(writer);
source = javax.xml.transform.dom.DOMSource(doc);

transformer.transform(source, result);

我没有收到任何错误,但 XML 文件仍未修改。

编辑 2

import javax.xml.xpath.*
import javax.xml.transform.*
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

doc = xmlread(which('ImagingSensor.vpar'));

factory = XPathFactory.newInstance();
xpath = factory.newXPath();
expr = xpath.compile('/data//parameter[@name=''FOV'']/double');

nodeList = expr.evaluate(doc,XPathConstants.NODESET);
disp(char(nodeList.item(0).getFirstChild.getNodeValue))

nodeList.item(0).getFirstChild.setNodeValue('0.03')

nodeList.item(0).getFirstChild.setNodeValue('0.03') 的值已正确更改(但仍未保存到文件中)。

使用nodeList.item(0).setNodeValue('0.03')时,没有正确更改值。

【问题讨论】:

    标签: java xml matlab xpath


    【解决方案1】:

    您似乎只修改内存中的 XML 文档对象。最后尝试将对象保存回 XML 文件。可能是这样的*:

    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    Result output = new StreamResult(new File("myXMLfile.xml"));
    Source input = new DOMSource(myDocument);
    
    transformer.transform(input, output);
    

    *) 我不是 Java 人,sn-p 来自这个线程:How to save parsed and changed DOM document in xml file?

    【讨论】:

    • 如果更新后打印节点值,它真的改变了吗?看起来您设置的节点与之前显示的节点不同,不是吗?
    • 你是对的。我在更新它后打印了这个值,它仍然是一样的。但即使有了这个改变,它仍然没有被保存。请参阅我的第二次编辑。
    • 只是为了确保,在您进行测试时,第二次编辑之后是第一次编辑(保存回文件)吗?
    • 是的,我的第二次编辑包含第一次编辑的代码。现在,当我显示更改后的节点值时,我看到它已正确更改。
    • 您的代码使用java.io.StringWriter(),但我上面链接的线程使用File()。如果我没记错的话,你需要在最后手动将writer.ToString() 的结果保存到 XML 文件中然后...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多