0

我有以下 .xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
   <book id="1">
      <name>Book-1</name>
      <author>Author-1</author>
   </book>
</bookstore>

问题是我想用id="1". 我想要删除书节点的方法,以便自动删除其所有子节点。有没有办法这样做?

4

2 回答 2

1

您可以使用XSLT脚本:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="book[@id='1']"/>
</xsl:stylesheet>

基本上,一个人所做的是复制整个文件而没有与模式匹配的实体"book[@id='1']"

XSLT 当然会引入一些开销,但优点是:

  • 当查询变得更复杂时,您可以轻松修改转换
  • 执行机制比您自己编写的代码更无错误(无意冒犯,但 XSLT 程序已被成千上万的人使用,因此将调试简单的错误)
  • 您可以使用许多程序测试转换,通过对转换进行硬编码,您必须自己编写测试平台。
  • 在某些情况下,XSLT 甚至会因为程序员试图优化执行而运行得更快。

使用 DOM 解析器(不指定整个文件,希望你熟悉 DOM):

NodeList nList = doc.getElementsByTagName("book");
for (int temp = 0; temp < nList.getLength(); temp++) {
    Node nNode = nList.item(temp);
    if (nNode.getNodeType() == Node.ELEMENT_NODE) {
        Element eElement = (Element) nNode;
        if(eElement.getAttribute("id").equals("1")) {
            doc.removeChild(eElement);
        }
    }
}
于 2013-10-12T18:45:16.107 回答
0

还有另一种简单的解决方案可用于完全解析 XML 文件。浏览Xstream的文档

于 2013-10-12T20:48:54.367 回答