Java—读取XML,让所有实体保持独立
我想使用SAX或StAX读取XHTML文件,只要效果最好。 但我不希望实体被解析、替换或诸如此类的事情。 理想情况下,他们应该保持现状。 我不想使用DTD 下面是一个(可执行文件,使用Scala 2.8.x)示例: 给定以下xhtml文件Java—读取XML,让所有实体保持独立,java,xml,sax,entities,stax,Java,Xml,Sax,Entities,Stax,我想使用SAX或StAX读取XHTML文件,只要效果最好。 但我不希望实体被解析、替换或诸如此类的事情。 理想情况下,他们应该保持现状。 我不想使用DTD 下面是一个(可执行文件,使用Scala 2.8.x)示例: 给定以下xhtml文件 <html> <head> <title>StAX Test</title> </head> <body> <h1>Ha
<html>
<head>
<title>StAX Test</title>
</head>
<body>
<h1>Hallo StAX</h1>
<p id="html">
<div class="header">
</p>
<p id="stuff">
Überdies sollte das hier auch als Copyright sichtbar sein: ©
</p>
Das war's!
</body>
</html>
因此,所有实体或多或少都被成功地取代了。
但是,我所期望和想要的是:
StAX Test - stax-test.xhtml
------
StAX Test
Hallo StAX
<div class="header">
Überdies sollte das hier auch als Copyright sichtbar sein: ©
Das war's!
------
Entities: // well, or no entities above and instead:
// Entities: lt, quot, quot, gt, Uuml, #169
这可能吗?
我想解析XHTML,做一些修改,然后再次将其输出为XHTML。所以我真的希望实体保留在结果中
我也不明白为什么Uuml被报告为EntityReference事件,而其余的则不是。在Java中,我会使用正则表达式
public static void main(String... args) throws IOException {
BufferedReader buf = new BufferedReader(new FileReader(args[0]));
Pattern entity = Pattern.compile("&([^;]+);");
Set<String> entities = new LinkedHashSet<String>();
for (String line; (line = buf.readLine()) != null; ) {
Matcher m = entity.matcher(line);
while (m.find())
entities.add(m.group(1));
}
buf.close();
System.out.println("Entities: " + entities);
}
在Java中,我将使用正则表达式
public static void main(String... args) throws IOException {
BufferedReader buf = new BufferedReader(new FileReader(args[0]));
Pattern entity = Pattern.compile("&([^;]+);");
Set<String> entities = new LinkedHashSet<String>();
for (String line; (line = buf.readLine()) != null; ) {
Matcher m = entity.matcher(line);
while (m.find())
entities.add(m.group(1));
}
buf.close();
System.out.println("Entities: " + entities);
}
“为什么Uuml被报告为实体引用事件而其余的没有”的答案是,其余的由XML规范定义,而Ü代码>特定于
由于您的目标是编写修改后的XHTML,因此可以通过将“encoding”设置为“US-ASCII”和/或将“method”设置为“html”来强制序列化程序发出数字实体引用。(Java XML序列化程序的基础)指出,当方法为html时,序列化程序“可以使用字符实体引用输出字符”。如果不支持命名实体,将编码设置为ASCII可能会强制它使用数字实体。对于“为什么Uuml报告为EntityReference事件,而其余未报告为EntityReference事件”的答案是,其余部分由XML规范定义,而Ü代码>特定于
由于您的目标是编写修改后的XHTML,因此可以通过将“encoding”设置为“US-ASCII”和/或将“method”设置为“html”来强制序列化程序发出数字实体引用。(Java XML序列化程序的基础)指出,当方法为html时,序列化程序“可以使用字符实体引用输出字符”。如果不支持命名实体,将编码设置为ASCII可能会强制它使用数字实体。一点术语:&x169
是一个数字字符引用(不是实体),并且auml代码>是实体引用(不是实体)
我认为任何XML解析器都不会向应用程序报告数字字符引用——它们总是会被扩展的。实际上,您的应用程序不应该关心这一点,就像它关心属性之间有多少空白一样
对于实体引用,低级解析接口(如SAX)将报告实体引用的存在——无论如何,当实体引用出现在元素内容中时,它会报告实体引用,而不是在属性内容中。有些特殊事件只通知LexicalHandler,而不通知ContentHandler。一点术语:&x169
是一个数字字符引用(不是实体),并且auml代码>是实体引用(不是实体)
我认为任何XML解析器都不会向应用程序报告数字字符引用——它们总是会被扩展的。实际上,您的应用程序不应该关心这一点,就像它关心属性之间有多少空白一样
对于实体引用,低级解析接口(如SAX)将报告实体引用的存在——无论如何,当实体引用出现在元素内容中时,它会报告实体引用,而不是在属性内容中。有些特殊事件只通知LexicalHandler,而不通知ContentHandler。而且与几乎所有试图使用正则表达式解析XML的人一样,您可能错了。例如,您的正则表达式将拾取注释和CDATA部分中出现的实体类内容;如果一条评论包含一个没有分号的符号,那么它将造成严重破坏。永远不要使用正则表达式来解析XML——你总是会弄错的。“向下投票!”迈克尔·凯,这是一个很好的解释,解释了为什么它可能是不好的。我怀疑您遇到的XML比我遇到的更“疯狂”。我看到的XML通常是有目的的,就像几乎所有试图用正则表达式解析XML的人一样,你可能错了。例如,您的正则表达式将拾取注释和CDATA部分中出现的实体类内容;如果一条评论包含一个没有分号的符号,那么它将造成严重破坏。永远不要使用正则表达式来解析XML——你总是会弄错的。“向下投票!”迈克尔·凯,这是一个很好的解释,解释了为什么它可能是不好的。我怀疑您遇到的XML比我遇到的更“疯狂”。我所看到的XML通常是为特定目的而设计的。
public static void main(String... args) throws IOException {
BufferedReader buf = new BufferedReader(new FileReader(args[0]));
Pattern entity = Pattern.compile("&([^;]+);");
Set<String> entities = new LinkedHashSet<String>();
for (String line; (line = buf.readLine()) != null; ) {
Matcher m = entity.matcher(line);
while (m.find())
entities.add(m.group(1));
}
buf.close();
System.out.println("Entities: " + entities);
}
Entities: [lt, quot, gt, Uuml, #169]