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

Java XML解析:避免实体引用解析

江鹏
2023-03-14
问题内容

我目前正在使用DOM解析器来解析XHTML文档,例如:

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);

final DocumentBuilder db = dbf.newDocumentBuilder();
db.setEntityResolver(MY_ENTITY_RESOLVER);
db.setErrorHandler(MY_ERROR_HANDLER);
...
final Document doc = db.parse(inputSource);

我的问题是,当我的文档包含一个实体引用时,例如:

<p>&euro;</p>

我的解析器为包含“€”而不是“&euro;”的内容创建了一个Text节点。这就是说,它正在按预期的方式解析实体(XHTML 1.0 Strict
DTD链接到ENTITIES Latin1 DTD,这反过来确定了“&euro;”与“€”的对等)。

问题是,我不希望解析器执行此类操作。 我想保留“&euro;” 文字未修改

我已经尝试过:

final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);

但:

  1. 我不喜欢这样做,因为我担心这会使某些解析器实现无法从XHTML 1.0 Strict DTD 导航 到ENTITIES Latin1 DTD,因此不考虑“&euro;”。作为已 声明的 实体。

  2. 当我这样做时,它会奇怪地创建两个节点:一个“磅”实体节点和一个在其后带有“€”符号的文本节点。

有任何想法吗? 是否可以在DOM分析器中配置它而不用 预处理 XHTML并用所有“&”符号代替其他东西?

解决方案可以是DOM解析器,也可以是SAX解析器,我不介意使用SAX解析,然后使用转换来创建DOM。

另外,我不能切换到非标准的XML解析libray。没有jdom,没有jsoup,没有HtmlCleaner等。

非常感谢。


问题答案:

我采用的方法是用一个唯一的标记替换任何实体,Xerces将其视为纯文本。转换为Document对象后,标记将替换为Entity Reference对象。

请参阅http://sourceforge.net/p/commonclasses/code/14/tree/trunk/src/com/redhat/ecs/commonutils/XMLUtilities.java中的convertStringToDocument()函数。



 类似资料:
  • 对于任何一个 ORM 工具,大都是根据配置者约定了解你打算怎么把一张数据表与你的 Java 对象 映射到一起。默认的 Nutz.Dao 采用 Java 注解(Annotation) 的方式描述这个映射,但是,当然 世界上还有很多其它的映射方式,比如用各种配置文件,比如 JPA 的注解,或者你很想把这个 映射关系写在数据库的几张表里,甚至一个 Excel 表格里(你就觉得这样很酷) 从 1.b.38

  • 问题内容: 对于stackoverflow社区,我创建了此方法以将一些EditText字段翻倍。我添加了if语句专门用于避免解析错误,因为我知道我的几个EditText字段将留为空白。但是,它们仍然在运行时继续运行。有人知道避免解析空白字段的正确方法吗?非常感谢你。 问题答案: 你为什么不尝试这样的事情? 编辑:请注意,这未经测试…此处没有编译器。:’( 由于如果字符串为null,则抛出Numbe

  • 我有一个输入json字符串,其中包含几个已经转义的特殊字符和一些未转义的特殊字符(如en-dash/em-dash)。解析此json字符串(需要解析此字符串以检索对象数组)后,它将具有特殊字符的字符串转换为Unicode值(例如,将短划线字符转换为2013)。我的要求是不要转义任何特殊字符,并保持其他已转义字符不变。简单来说,在解析JSON字符串后,内容不应更改。 请建议一些方法来处理这个问题。

  • 我想在一个项目中封装实体框架。这个项目将单独进行数据库访问。更新的时候,我想把一个域模型映射到EF。目的是解决方案的其他层不应该了解基础结构。 我的问题是我需要在我的“调用者”项目中引用EF使其工作。 有没有办法避免这种情况? 解决方案-ConsoleProject-EntityFrameworkProject(来自Nuget的EF)

  • 现在,如果我查询集合中的特定文档,对动物的引用会自动解析吗?我会在查询结果中得到动物的名字吗?如果不是,我如何做到这一点?

  • 我正在Android Studio中尝试Kotlin和Kotlin Android扩展。我在Ubuntu 14.04上的Android Studio v1.5.1和OS X El Capitan上的Android Studio v1.5.1中都进行了尝试,得到了相同的结果。 下面是我正在做的事情: null 然后进入生成的content_main.xml文件,并为“hello World!”添加一