有什么方法可以像我们使用 XPath 读取的方式一样写入 XML 吗?

Is there any way to Write XML the same way how we are reading using XPath?

我有一个如下所示的 XML,我正在使用 XPath 阅读 XML。因为我知道数据所在的确切位置,所以我将路径动态传递给 Expression 对象并获取值。

    <MESSAGE xmlns:xlink="http://www.w3.org/1999/xlink">
    <ABOUT_VERSIONS>
    <ABOUT_VERSION SequenceNumber="1"  xlink:label="ASSET_1" >
    <CreatedDatetime>2015-08-24T09:30:47Z</CreatedDatetime>
    <DataVersionName>Purchase Example</DataVersionName>
    </ABOUT_VERSION>
    </ABOUT_VERSIONS>
    <DEALS>
         <DEAL>
              <ACCOUNT>
                  <Name>Test</Name>
              </ACCOUNT>
         </DEAL>
    </DEALS>
    </MESSAGE>

我正在使用下面的代码来读取 XML。

XPathFactory xpf = XPathFactory.newInstance();            
XPath xPath = xpf.newXPath();
XPathExpression pathExpression = 
xPath.compile("MESSAGE/ABOUT_VERSIONS/ABOUT_VERSION");   
InputSource inputSource = new InputSource("C:/Sample.xml");  
NodeList Nodes = (NodeList) 
xPath.evaluate("MESSAGE/ABOUT_VERSIONS/ABOUT_VERSION", inputSource, 
XPathConstants.NODESET);

在Java中有没有这样写XML的方法?稍后我需要用额外的标签和额外的数据编写相同的 XML。

XPath本身是一种模式匹配语言,就像正则表达式一样,所以不能直接用它来进行操作。但是像正则表达式一样,有一些引擎允许您将 XPath 作为更大的技术堆栈的一部分来修改文档。

如果您正在尝试修改现有的 XML 文档,您应该考虑将其作为 DOM 树来阅读。然后,您可以使用 XPath 轻松找到要修改的单个节点或节点组。使用 DOM 模型修改它们,然后将其序列化回磁盘。

或者,您可以创建一个 XSLT sheet 来转换 输入。您可以从身份转换开始,看起来像这样...

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>

这将产生与输入文档相同的 XML 输出。然后您可以开始添加模板来修改与您所需的 XPath 相匹配的特定节点。根据我的经验,这往往比 DOM 操作要难得多,因为您通常在 Java 中执行的大部分逻辑现在必须在 XSLT 中执行,它是它自己的语。但是,由于您可以使用流进行 XSLT 转换,因此如果您正在处理难以放入内存的非常大的文档,有时会更容易。

我会提供更多细节,但老实说,我已经有 6 年没有使用过这些了,所以我对语法有点生疏。