Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—读取XML,让所有实体保持独立_Java_Xml_Sax_Entities_Stax - Fatal编程技术网

Java—读取XML,让所有实体保持独立

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

我想使用SAX或StAX读取XHTML文件,只要效果最好。 但我不希望实体被解析、替换或诸如此类的事情。 理想情况下,他们应该保持现状。 我不想使用DTD

下面是一个(可执行文件,使用Scala 2.8.x)示例:

给定以下xhtml文件

<html>
    <head>
        <title>StAX Test</title>
    </head>
    <body>
        <h1>Hallo StAX</h1>
        <p id="html">
            &lt;div class=&quot;header&quot;&gt;
        </p>
        <p id="stuff">
            &Uuml;berdies sollte das hier auch als Copyright sichtbar sein: &#169;
        </p>
        Das war's!
    </body>
</html>
因此,所有实体或多或少都被成功地取代了。 但是,我所期望和想要的是:

StAX Test - stax-test.xhtml

------


    StAX Test


    Hallo StAX

      &lt;div class=&quot;header&quot;&gt;


      &Uuml;berdies sollte das hier auch als Copyright sichtbar sein: &#169;

    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]