有什么方法可以像我们使用 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 年没有使用过这些了,所以我对语法有点生疏。
我有一个如下所示的 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 年没有使用过这些了,所以我对语法有点生疏。