当前位置: 首页 > 面试题库 >

在不更改XML的情况下解析Java中包含HTML实体的XML文件

左劲
2023-03-14
问题内容

我必须解析Java中的一堆XML文件,这些文件有时且无效地包含HTML实体,例如—>等等。我了解解决此问题的正确方法是在解析之前向XML文件添加合适的实体声明。但是,我无法做到这一点,因为我无法控制那些XML文件。

每当Java XML解析器遇到这样的实体时,是否存在我可以重写的某种回调?我无法在API中找到一个。

我想使用:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

DocumentBuilder parser = dbf.newDocumentBuilder();
Document        doc    = parser.parse( stream );

我发现可以resolveEntity在中重写org.xml.sax.helpers.DefaultHandler,但是如何将其与更高级别的API一起使用?

这是一个完整的示例:

public class Main {
    public static void main( String [] args ) throws Exception {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder parser = dbf.newDocumentBuilder();
        Document        doc    = parser.parse( new FileInputStream( "test.xml" ));
    }

}

与test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <bar>Some&nbsp;text &mdash; invalid!</bar>
</foo>

产生:

[Fatal Error] :3:20: The entity "nbsp" was referenced, but not declared.
Exception in thread "main" org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 20; The entity "nbsp" was referenced, but not declared.

更新:我一直在使用调试器在JDK源代码中四处逛逛,伙计,这是多少意大利面。我不知道那里有什么设计,或者是否有一个。一层洋葱可以互相叠放多少层?

他们的关键类似乎是com.sun.org.apache.xerces.internal.impl.XMLEntityManager,但是我找不到任何可以在使用前向其中添加内容的代码,或者试图不通过该类而尝试解析实体的代码。


问题答案:
为此,我将使用像Jsoup这样的库。我在下面测试了以下内容,并且可以正常工作。我不知道这是否有帮助。可以在这里找到: http

//jsoup.org/download

public static void main(String args[]){

String html = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><foo>" + 
              "<bar>Some&nbsp;text &mdash; invalid!</bar></foo>";
Document doc = Jsoup.parse(html, "", Parser.xmlParser());

for (Element e : doc.select("bar")) {
    System.out.println(e);
}

}

结果:

<bar>
 Some&nbsp;text — invalid!
</bar>

从文件加载可以在这里找到:

http://jsoup.org/cookbook/input/load-document-from-
file



 类似资料:
  • 我正在尝试使用DOMParser解析带有HTML字符串的XML文件。问题是getTextContent()方法只获取文本,而不获取其中的任何HTML标记。我希望字符串按原样返回,而不是按解析后的版本返回。我搜索了整个网络,却找不到任何对我有帮助的东西。顺便说一句,我无法对HTML字符串进行任何更改,因为在大约500个文件中有超过100k个Sting。 测验xml文件 Java模块 实际输出 这里有

  • 问题内容: 什么HTML解析器具有以下功能: 快速 线程安全 可靠且无错误 解析HTML和XML 处理错误的HTML 有一个DOM实现 支持HTML4,JavaScript和CSS标签 相对简单的面向对象的API 您认为哪种解析器更好? 谢谢。 问题答案: ApacheTika是最佳选择。Apache最近从现有项目中提取了许多子项目并将其公开。提卡(Tika)是其中之一,以前是Apache Luc

  • 问题内容: 我想解组一个包含数据集合的xml文件,像这样 我们知道这可以通过两个类完成:人员,使用Castor的人员,JAXB或其他框架。 但是,如果不编写收集类的Persons怎么办? 问题答案: 寻找一种方法来告诉Castor您希望它生成一个Person实例。 http://www.castor.org/how-to-map-a-list-at- root.html

  • 我真的希望你能在这件事上帮我....我需要从我的xml文件中获取特定的数据,但我卡在了一个点上,我不知道如何继续... 我想从网络获得:网络名称;From代码:mcc和mnc代码;From设置:名称、id、类型、参数名称、值; 这就是我的xml文件的结构: 这就是我目前掌握的......我真的不能再继续下去了...在字符串content=CNode.GetLastChild().GetTextCo

  • 我试图确定.NET核心应用程序是否容易受到XML外部实体(XXE)注入攻击。我读了这个OWASP XXE预防备忘单,它告诉我,例如,在4.5.2之前的.NET Framework版本中,

  • 问题内容: 我目前正在使用DOM解析器来解析XHTML文档,例如: 我的问题是,当我的文档包含一个实体引用时,例如: 我的解析器为包含“€”而不是“&euro;”的内容创建了一个Text节点。这就是说,它正在按预期的方式解析实体(XHTML 1.0 Strict DTD链接到ENTITIES Latin1 DTD,这反过来确定了“&euro;”与“€”的对等)。 问题是,我不希望解析器执行此类操作