有什么方法可以像使用XPath读取XML一样编写XML?

时间:2018-10-20 04:02:33

标签: java xml xpath xlink

我有一个类似下面的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。

1 个答案:

答案 0 :(得分:1)

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

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

或者,您可以创建XSLT工作表来转换输入。您可以从身份转换开始,如下所示……

<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是它自己的语言。但是,由于您可以通过流进行XSLT转换,因此,如果要处理非常大的文档(有时难以容纳在内存中),有时会更容易。

我会提供更多细节,但是老实说我已经有6年没有使用任何细节了,所以我对语法有些不了解。