0

我有一个包含一堆正则表达式的源文本文件。我正在阅读文本文件,将正则表达式匹配分配给数组索引,并使用 DOM 创建 XML。

但是,我需要将一些样板信息添加到生成的 XML 文档中。我不想创建数百个新的、复杂的嵌套 DOM 元素,而只想使用 element.setTextContent(someBoilerPlateXML) 将 XML 样板信息放入 XML DOM 元素之一。

我正在尝试 org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4 来做到这一点。它似乎适用于我的 System.out.println(someBoilerPlateXML) 测试,但不适用于 element.setTextContent(someBoilerPlateXML) 实现。

例如:

输入: String test = org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4("<Hello id=\"id\"/>"); System.out.println(test);

输出: <Hello id="id"/>

输入: Element element= doc.createElement("element");
element.setTextContent(org.apache.commons.lang3.StringEscapeUtils.unescapeHtml4("<Hello id=\"id\">"));

在生成的 XML 文件中输出: &lt;Hello id="id"/&gt

为什么会这样做,我怎样才能做到这一点?我需要使用另一个免费包吗?

4

2 回答 2

1

element.setTextContent正如您所发现的,它将转义您提供的文本,而不是将其识别为 xml 并将其处理。

如果您想要将 xml 的文本表示形式添加为 xml,则需要将其作为 xml 处理,这意味着将其解析为 DOM Node,然后以该形式附加它。

如果您的文本不是完整的 xml,这将不起作用。在您的示例中,您只有一个开始标记,无法将其解析为Node.

但是,如果它是完整的并且您发现生成文本更容易,您可以执行以下操作:

    DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();

    Document doc = documentBuilder.newDocument();
    Element element= doc.createElement("element");
    doc.appendChild(element);

    Document newDoc = documentBuilder.parse(new InputSource(new StringReader("<Hello id=\"id\"/>")));

    Element newElement = newDoc.getDocumentElement();
    Node node = doc.importNode(newElement, true);

    element.appendChild(node);
于 2012-10-21T03:08:12.157 回答
0

这就是 xml 文本内容被转义的方式,当您读回原始文本时,您将取回原始文本

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element element= doc.createElement("element");
element.setTextContent("<Hello id=\"id\">");
doc.appendChild(element);

Transformer trf = TransformerFactory.newInstance().newTransformer();
trf.transform(new DOMSource(doc), new StreamResult(System.out));
System.out.println();
System.out.println(element.getTextContent());

打印出来

<?xml version="1.0" encoding="UTF-8"?><element>&lt;Hello id="id"&gt;</element>
<Hello id="id">
于 2012-10-20T19:42:39.023 回答