Java 如何跳过xml标记中文本的验证?

Java 如何跳过xml标记中文本的验证?,java,xml,parsing,xsd,xml-parsing,Java,Xml,Parsing,Xsd,Xml Parsing,我正在从bugzilla下载以下格式的xml: <bugzilla> <bug> <bug_id>111</bug_id> <short_desc>text 1 & 2</short_desc> </bug> <bug> <bug_id>222</bug_id>

我正在从bugzilla下载以下格式的xml:

<bugzilla>
     <bug>
          <bug_id>111</bug_id>
          <short_desc>text 1 & 2</short_desc>
      </bug>
      <bug>
          <bug_id>222</bug_id>
          <short_desc>text 2 <this is a short desc> </short_desc>
     </bug>
</bugzilla>

无论如何都要解决这个问题。

正如您所知,必须解析有效的XML,因为没有HTML中的模糊匹配。标准解决方案是放置一个
。(CDATA代表字符数据。)

请注意,反斜杠
\
必须在java字符串中自转义

java 9修复:

xml = xml.replaceAll("(?s)<short_desc>(.*)</short_desc>",
        matchResult -> "<short_desc>"
                       + StringEscapeUtils.escapeXml10(matchResult.group(1))
                       + "</short_desc>");
xml=xml.replaceAll((?s)(.*),
匹配结果->“”
+StringEscapeUtils.escapeXml10(匹配结果组(1))
+ "");
或者不使用apache公共语言:

xml = xml.replaceAll("(?s)<short_desc>(.*)</short_desc>",
        matchResult -> "<short_desc>"
                       + matchResult.group(1)
                             .replace("&", "&amp;")
                             .replace("\"", "&quot;")
                             .replace("<", "&lt;")
                             .replace(">", "&gt;")
                       + "</short_desc>");
xml=xml.replaceAll((?s)(.*),
匹配结果->“”
+matchResult.group(1)
.替换(“&”、“&;”)
.替换(“\”,“”)
.替换(“,”)
+ "");

这不是验证,而是形式良好。这并不是验证某些约束是否得到了遵守,而是是否有可能阅读本文。XML文档必须格式良好,否则解析器将无法知道应该表示什么数据以及如何从那里继续解析,换句话说,它将无法完成预期的工作,因此假装没有意义。可以跳过验证,并且通常是。良好的格式是必须的,因为它是进行解析的一部分。@kumesana感谢您提供的信息。它起了作用。我无法控制修改xml文件。就像你建议的那样,我将标签内容包含在CDATA标签中,效果很好。谢谢。您能否解释解析器跳过CDATA标记的方式和原因,或者如何考虑CDATA标记中的内容。CDATA部分由
]]>
分隔,是包含未处理文本的一种方式(应检查是否包含“]>”)。在DOM树中,它不是一个#文本节点,而是它自己的节点。然而,大多数XMLAPI提供了一个get文本内容,它收集了几个连续的#文本节点等等。因此它可以工作。
String xml = new String(Files.readAllBytes(Paths.get("C:\\test\\file.xml")),
         StandardCharsets.UTF_8);
xml = "<?xml version=\"1.0\">\n" + xml;
xml = xml.replace("<short_desc>", "<short_desc><![CDATA[");
xml = xml.replace("</short_desc>", "]]></short_desc>");
jaxbUnmarshaller.unmarshal(new StreamSource(new StringReader(xml)));
xml = xml.replaceAll("(?s)<short_desc>(.*)</short_desc>",
        matchResult -> "<short_desc>"
                       + StringEscapeUtils.escapeXml10(matchResult.group(1))
                       + "</short_desc>");
xml = xml.replaceAll("(?s)<short_desc>(.*)</short_desc>",
        matchResult -> "<short_desc>"
                       + matchResult.group(1)
                             .replace("&", "&amp;")
                             .replace("\"", "&quot;")
                             .replace("<", "&lt;")
                             .replace(">", "&gt;")
                       + "</short_desc>");