Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
是否有一个JavaXMLAPI可以解析文档而不解析字符实体?_Java_Xml_Parsing_Stax_Character Entities - Fatal编程技术网

是否有一个JavaXMLAPI可以解析文档而不解析字符实体?

是否有一个JavaXMLAPI可以解析文档而不解析字符实体?,java,xml,parsing,stax,character-entities,Java,Xml,Parsing,Stax,Character Entities,我有一个程序需要解析包含字符实体的XML。程序本身不需要解析它们,而且它们的列表很大,并且会发生变化,因此如果可以的话,我希望避免对这些实体的显式支持 下面是一个简单的例子: <?xml version="1.0" encoding="UTF-8"?> <xml>Hello there &something;</xml> 对于上面的XML,它将打印“实体引用:something”带有的SAX解析可能适合您的目的。你当然可以压制他们,你可能会找到一种方

我有一个程序需要解析包含字符实体的XML。程序本身不需要解析它们,而且它们的列表很大,并且会发生变化,因此如果可以的话,我希望避免对这些实体的显式支持

下面是一个简单的例子:

<?xml version="1.0" encoding="UTF-8"?>
<xml>Hello there &something;</xml>
对于上面的XML,它将打印“
实体引用:something

带有的SAX解析可能适合您的目的。你当然可以压制他们,你可能会找到一种方法,让他们悬而未决


这似乎是最相关的:它显示了如何将实体解析为字符串。

STaX API支持不通过属性替换字符实体引用的概念:

需要解析器替换 内部实体引用及其 替换文本并将其报告为 人物


这可以设置为
XmlInputFactory
,然后依次用于构造
XmlEventReader
XmlStreamReader
。但是,API谨慎地说,此属性只是为了强制实现执行替换,而不是强制实现不替换它们。尽管如此,它还是值得一试。

我不是Java开发人员,但我“认为”Java xml类支持与.net类似的功能来实现这一点。在.net xmlreadersettings类中,您将ProhibitDtd属性设置为false,并将XmlResolver属性设置为null。这将导致解析器忽略外部引用的实体,而不会在读取它们时引发异常。我刚刚在谷歌上搜索了“Java忽略enity”,得到了很多点击,其中一些似乎是针对这个主题的。我意识到这不是你问题的全部答案,但它应该为你指出一个有用的方向。

仅在禁用对外部实体的支持时对我有效:

XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);

你能给出一个XML文件的例子吗?如果你有实体,它们必须被定义,或者你的文档无效。我试过了。EntityResolver似乎只用于外部实体:在本例中,没有调用resolveEntity(…)方法,解析器失败,出现“org.xml.sax.SAXParseException:实体“something”被引用,但没有声明。”这正是我想要的。如果将该属性设置为false,您将在流中看到EntityReference事件,您可以通过getName()方法从中获取实体名称。
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false);
inputFactory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);