问题描述
我们正在使用StAXON(由于其通过StAX处理的性能)来解析json输入,该输入包含冒号(:)作为元素名称。冒号是JSON中的有效元素名称,但是在通过StAXON进行解析时,我们会收到异常(XMLStreamException)。
如果我将namespaceSeparator用作'\ 0'(例如new jsonxMLConfigBuilder().namespaceSeparator(Character.MIN_VALUE)
),则可以使用。但这只会更改名称空间分隔符。
我的问题/疑问:
示例输入:{"cust:person":{"name":"John Doe","phone":"555-1111"}}
例外
Exception in thread "main" javax.xml.stream.XMLStreamException: Unbound prefix: cust
at de.odysseus.staxon.base.AbstractXMLStreamScope.verify(AbstractXMLStreamScope.java:212)
at de.odysseus.staxon.base.AbstractXMLStreamScope.setStartTagClosed(AbstractXMLStreamScope.java:234)
at de.odysseus.staxon.base.AbstractXMLStreamReader.ensureStartTagClosed(AbstractXMLStreamReader.java:191)
at de.odysseus.staxon.base.AbstractXMLStreamReader.readStartElementTag(AbstractXMLStreamReader.java:272)
at de.odysseus.staxon.json.jsonxMLStreamReader.readStartElementTag(jsonxMLStreamReader.java:93)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:202)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:153)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:183)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:153)
at de.odysseus.staxon.json.jsonxMLStreamReader.consume(jsonxMLStreamReader.java:183)
at de.odysseus.staxon.base.AbstractXMLStreamReader.initialize(AbstractXMLStreamReader.java:216)
at de.odysseus.staxon.json.jsonxMLStreamReader.initialize(jsonxMLStreamReader.java:87)
at de.odysseus.staxon.json.jsonxMLStreamReader.(jsonxMLStreamReader.java:78)
at de.odysseus.staxon.json.jsonxMLInputFactory.createXMLStreamReader(jsonxMLInputFactory.java:150)
at de.odysseus.staxon.json.jsonxMLInputFactory.createXMLStreamReader(jsonxMLInputFactory.java:45)
at jsonxml.main(jsonxml.java:27)
谢谢
解决方法
冒号是合法的名称字符,以防解析器无法识别名称空间。您应该能够关闭基础XMLInputFactory上的名称空间意识(不知道StAXON的详细信息)。
,这样做很安全,但可能不是您想要的。由于StAXON试图将JSON像XML一样对待,因此您应该为库提供所需的内容:“ cust”前缀的名称空间。了解有关StAXON‘s conventions here的信息。
要声明名称空间:
new JsonXMLConfigBuilder().namespaceMapping(„cust“,„http://example.com/ns/cust“)