大文本字符串中的 CreateTextNode 转义字符

Posted

技术标签:

【中文标题】大文本字符串中的 CreateTextNode 转义字符【英文标题】:CreateTextNode escape characters in large text string 【发布时间】:2015-01-03 00:53:16 【问题描述】:

字符我正在尝试在 XML 文档文本节点中包含正确的字符:

Element request = doc.createElement("requestnode");
request.appendChild(doc.createTextNode(xml));
rootElement.appendChild(request);

xml 字符串是我读过的一个大型 xml 文件的一部分:

Document doc = docBuilder.newDocument();
Element rootElement = doc.createElement("rootnode");
doc.appendChild(rootElement);

<firstname>John</firstname>
<dateOfBirth>28091999</dateOfBirth>
<surname>Doe</surname>

问题在于将它传递给 createTextNode 正在替换一些章程:

&lt;firstname&gt;John&lt;/firstname&gt;&#13;
&lt;dateOfBirth&gt;28091999&lt;/dateOfBirth&gt;&#13;
&lt;surname&gt;Doe&lt;/surname&gt;&#13;

有什么方法可以在文本节点中保留正确的字符()。我已经阅读了有关使用 importnode 的信息,但这不是正确的 XML,只是文件的一部分。

任何帮助将不胜感激。

编辑:当我正在构建要导入 SOAP UI 的 XML 时,我需要将 xml 字符串(不是完全格式化的 xml,只是外部 xml 文件的一部分)放在“请求节点”中

【问题讨论】:

为了数据完整性,我总是会采用一种方案,在该方案中我实际上从字符串中解析 XML,以确保它是自包含的(例如,所有开始标签都有相应的结束标签等)。这个***.com/questions/807418/… 可能会有所帮助 【参考方案1】:

您不能将元素标记和文本传递给createTextNode() 方法。您只需要传递文本。然后,您需要将此文本节点附加到元素。

如果源是另一个 XML 文档,您必须从一个元素中提取文本节点并将其插入到另一个元素中。您可以抓取一个节点(元素和文本)并尝试作为文本节点插入另一个节点。这就是您看到所有转义字符的原因。

另一方面,您可以将此 Node 插入到另一个 XML 中(如果结构允许),应该没问题。

在您的上下文中,我假设“请求”是某种Node。 Node 的子元素可以是另一个元素、文本等。你必须非常具体。

你可以这样做:

Element name = doc.createElement("name");
Element dob = doc.createElement("dateOfBirth");
Element surname = doc.createElement("surname");

name.appendChild( doc.createTextNode("John") );
dob.appendChild( doc.createTextNode("28091999") );
surname.appendChild( doc.createTextNode("Doe") );

然后您可以将这些元素添加到父节点:

node.appendChild(name);
node.appendChild(dob);
node.appendChild(surname);

更新:作为替代方法,您可以打开文档流并将您的 XML 字符串作为字节流插入。像这样的东西(未经测试的代码,但很接近):

String xmlString = "<firstname>John</firstname><dateOfBirth>28091999</dateOfBirth><surname>Doe</surname>";

DocumentBuilderFactory fac = javax.xml.parsers.DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fac.newDocumentBuilder();
Document newDoc = builder.parse(new ByteArrayInputStream(xmlString.getBytes()));
Element newElem = doc.createElement("whatever");
doc.appendChild(newElem);

Node node = doc.importNode(newDoc.getDocumentElement(), true);
newElem.appendChild(node);

类似的东西应该可以解决问题。

【讨论】:

您好,感谢您的回答。我已经更详细地更新了我的问题。我遇到的真正问题是在传递给 createTextNode 时将 () 字符保留在我的 xml 字符串中。 嗨,正如你提到的,我一直在研究将字符串解析为字节流。然而,它给出了字符串中 xml 的结构。 “[致命错误]:1:3:根元素之前的文档中的标记必须格式正确。”有什么方法可以忽略 XML 格式,只将字符串解析为文本? 想想你在问什么。格式错误的 XML 文件将无法被解析为 DOM 文档。基本上你所拥有的是一个“有点”看起来像 XML 文件的文本文件。您将失去 XML 规范提供的功能。您需要确保最终的 XML 文档格式正确。格式正确与XML的基本规则有关:每个标签都有一个结束标签,关闭父元素之前关闭所有子元素,元素名称不能以数字开头等。找出违反此规则的内容并修复它。如果需要,请使用生成的 XML 字符串更新您的帖子。 再试一次。我刚刚意识到我的示例中的 XML 字符串缺少出生日期右括号中的“>”。对不起。如果我为您提供的答案解决了您的问题,请不要忘记将其标记为此类。祝你好运! 谢谢@Alexandre Germain。

以上是关于大文本字符串中的 CreateTextNode 转义字符的主要内容,如果未能解决你的问题,请参考以下文章

javascript 在 createTextNode 中用 <br> 替换 \n

PHP createTextNode() 使用 saveHTML() 仅显示文本

JavaScript 文本节点更新

带有 br 标签的 PHP createTextNode

将 HTML 实体放入 document.createTextNode

javascript document.createElement() document.createTextNode()