我有一个类似下面的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。
答案 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年没有使用任何细节了,所以我对语法有些不了解。