【问题标题】:Java edit XML file with DOMJava 用 DOM 编辑 XML 文件
【发布时间】:2021-10-18 08:39:57
【问题描述】:

我遇到了一些障碍。 我的目标是过滤掉除数字之外的所有内容。

这是xml文件

<?xml version="1.0" encoding="utf-8" ?>
<orders>
  <order>
     <stuff>"Some random information and # 123456"</stuff>
  </order>
</orders>

这是我不完整的代码。我不知道如何找到它,也不知道如何进行我想要的更改。

public static void main(String argv[]) {
        try {
            // Lesen der Datei
            File inputFile = new File("C:\\filepath...\\asdf.xml");
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
            Document doc = docBuilder.parse(inputFile);

            // I don't know where to go from there
            NodeList filter = doc.getChildNodes();
                    
            TransformerFactory transformerFactory = TransformerFactory.newInstance();
            Transformer transformer = transformerFactory.newTransformer();
            DOMSource source = new DOMSource(doc);
            StreamResult consoleResult = new StreamResult(System.out);
            transformer.transform(source, consoleResult);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

【问题讨论】:

  • 查看 Xpath,stackoverflow.com/questions/2811001/… 你可以通过类似 /orders/order/stuff 的方式获取东西的价值
  • 当您使用 XSLT Transformer 时,为什么不编写一个 XSLT 样式表来完成这项工作。不确定您是否想要一个具有先前结构但将 &lt;stuff&gt;"Some random information and # 123456"&lt;/stuff&gt; 转换为 &lt;stuff&gt;123456&lt;/stuff&gt; 的新 XML 文档,或者只是一个数字结果,但 XSLT 两者都可以。
  • 那么我将如何使用 XSLT 来做这件事呢?我对这一切都有些陌生。

标签: java xml dom edit


【解决方案1】:

当你使用

Transformer transformer = transformerFactory.newTransformer();

转换器是一个“身份转换器”——它将输入复制到输出而不做任何更改。实际上,您在这里只使用身份转换器进行序列化,将 DOM 转换为词法 XML。

如果您想对 XML 内容进行实际更改,您有两种选择:编写 Java 代码以在序列化内存中的 DOM 树之前对其进行修改,或者编写 XSLT 代码以便您的 Transformer 进行真正的转换,而不仅仅是身份转换。 XSLT 几乎可以肯定是更好的方法,只是它涉及更多的学习曲线。

我不确定您到底想要什么输出,因此很难为您提供工作代码。不幸的是,“过滤掉”这个短语是模棱两可的,当人们说“我想过滤掉 X”时,他们有时意味着他们想要删除 X,有时他们的意思是他们想要删除除 X 之外的所有内容。此外,“删除数字”是除非我们知道您的文档中可能出现的所有可能性,否则这不是一个完整的规范,例如数字总是以“#”开头,还是仅在这个示例输入中出现这种情况?但一种方法是删除所有数字,您可以通过调用 translate(., '0123456789', '') 来做到这一点。

请注意,如果您使用 XSLT,则不需要先构造 DOM,实际上,这是在浪费时间和空间。只需以StreamSource 的形式将词法 XML 作为输入提供给转换器。

【讨论】:

  • 我只想要 # 后面的数字,所以 123456 我对 XSLT 的经验为零,可能的解决方案是什么样的?
  • 我最初的想法是获取该节点的内容,将其放入一个字符串中,然后根据我的规范过滤该字符串并用更改后的字符串替换该节点。但是我真的不明白为什么关键字让我很困惑。
猜你喜欢
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2015-12-11
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多