Java 如何跳过xml标记中文本的验证?
我正在从bugzilla下载以下格式的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>
<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("&", "&")
.replace("\"", """)
.replace("<", "<")
.replace(">", ">")
+ "</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("&", "&")
.replace("\"", """)
.replace("<", "<")
.replace(">", ">")
+ "</short_desc>");