是否有一个Java XML API可以parsing文档而不parsing字符实体?
我有程序需要parsing包含字符实体的XML。 程序本身并不需要让它们解决,而且它们的列表很大,并且会改变,所以我想避免对这些实体的明确的支持。
这是一个简单的例子:
<?xml version="1.0" encoding="UTF-8"?> <xml>Hello there &something;</xml>
是否有一个Java XML API可以parsing文档而不parsing(非标准)字符实体? 理想情况下,它会把它们转化为一个特殊的事件或对象,可以专门处理,但我会find一个select,会默默地压制他们。
答案和例子:
Skaffman给了我答案:使用IS_REPLACING_ENTITY_REFERENCES
设置为false的StAXparsing器。
这里是我鞭打试验的代码:
XMLInputFactory inputFactory = XMLInputFactory.newInstance(); inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false); XMLEventReader reader = inputFactory.createXMLEventReader( new FileInputStream("your file here")); while (reader.hasNext()) { XMLEvent event = reader.nextEvent(); if (event.isEntityReference()) { EntityReference ref = (EntityReference) event; System.out.println("Entity Reference: " + ref.getName()); } }
对于上面的XML,它将打印“ Entity Reference: something
”。
STaX API通过IS_REPLACING_ENTITY_REFERENCES属性支持不replace字符实体引用的概念:
需要parsing器将内部实体引用replace为replace文本,并将其报告为字符
这可以被设置成一个XmlInputFactory
,然后被用来构造一个XmlEventReader
或XmlStreamReader
。 但是,API小心地说,这个属性只是为了强制执行replace,而不是强迫它不能取代它们。 不过,这是值得一试。
使用org.xml.sax.EntityResolver的 SAXparsing可能适合您的目的。 你可以肯定的压制他们,你也许可以find办法让他们解决。
本教程似乎最相关:它显示了如何将实体parsing为string。
我不是一个Java开发人员,但我认为“Java xml类支持.net类似的function来完成这一点。 在.net xmlreadersettings类中,将ProhibitDtd属性设置为false,并将XmlResolver属性设置为null。 这将导致parsing器忽略外部引用的实体,而不会在读取时抛出exception。 我只是做了一个谷歌search“Java忽略enity”,并得到了很多点击,其中一些似乎解决这个问题。 我意识到这不是对你的问题的完全回答,但它应该指向一个有用的方向。
只有在禁用外部实体的支持时才适用于我:
XMLInputFactory inputFactory = XMLInputFactory.newInstance(); inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false); inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);