java - 有没有办法像我们使用 XPath 读取的方式一样编写 XML?

标签 java xml xpath xlink

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

    <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 表来转换输入。您可以从身份转换开始,如下所示...

<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 年没有使用过这些了,所以我对语法有点生疏。

关于java - 有没有办法像我们使用 XPath 读取的方式一样编写 XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52902311/

相关文章:

java - POST 似乎不适用于我的 HttpURLConnection 表单

java - 解析xml文件的递归方式

html - 为什么 XPath contains(text() ,'substring' ) 没有按预期工作?

python - xpath 与 lxml for Python 获取数据

java - 内存不足错误 : Compressed class space

java - 使用 Java 中的 POI 从 Excel 文件读取和写入值需要哪些 jar 文件?

java - Autowired 类的 Cobertura 问题

java - 在 Spring 框架中使用 registerShutdownHook()

php - simplexml_load_file() 没有获取节点内容

xmlstarlet 根据条件选择值