【发布时间】:2018-02-14 17:54:23
【问题描述】:
当像“/”这样的一些特殊字符包含在一个属性的值中时,我在解组 XML 文件时遇到问题:
<field name = "test" value = "test&/"/>
我正在使用库 woodstox-core (v5.0.3) 和 stax2-api (3.1.4)
属性值在 XSD 中定义为规范化字符串,我认为允许字符“/”:
<xs:element name="field" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="xs:token" use="required" />
<xs:attribute name="value" type="xs:normalizedString" use="required" />
</xs:complexType>
</xs:element>
但是在进行解组调用时,会抛出异常:
XMLStreamReader xsr = null;
try {
// Create the XML stream reader
XMLInputFactory xif = XMLInputFactory.newFactory();
xsr = xif.createXMLStreamReader(inputStream, "UTF-8");
// Unmarshall the XML with JAXB, with XML schema validation enabled
JAXBContext jc = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
unmarshaller.setSchema(this.xmlSchema);
Root rootIndex = (Root) unmarshaller.unmarshal(xsr);
[...]
}
这里有一个例外:
Caused by: com.ctc.wstx.exc.WstxUnexpectedCharException: Unexpected character '/' (code 47) (expected a name start character)
at [row,col {unknown-source}]: [17,74]
at com.ctc.wstx.sr.StreamScanner.throwUnexpectedChar(StreamScanner.java:653) [woodstox-core-5.0.3.jar:5.0.3]
at com.ctc.wstx.sr.StreamScanner.parseFullName(StreamScanner.java:1933) [woodstox-core-5.0.3.jar:5.0.3]
at com.ctc.wstx.sr.StreamScanner.parseEntityName(StreamScanner.java:2058) [woodstox-core-5.0.3.jar:5.0.3]
at com.ctc.wstx.sr.StreamScanner.fullyResolveEntity(StreamScanner.java:1525) [woodstox-core-5.0.3.jar:5.0.3]
at com.ctc.wstx.sr.BasicStreamReader.parseAttrValue(BasicStreamReader.java:2017) [woodstox-core-5.0.3.jar:5.0.3]
at com.ctc.wstx.sr.BasicStreamReader.handleNsAttrs(BasicStreamReader.java:3145) [woodstox-core-5.0.3.jar:5.0.3]
at com.ctc.wstx.sr.BasicStreamReader.handleStartElem(BasicStreamReader.java:3043) [woodstox-core-5.0.3.jar:5.0.3]
at com.ctc.wstx.sr.BasicStreamReader.nextFromTree(BasicStreamReader.java:2919) [woodstox-core-5.0.3.jar:5.0.3]
at com.ctc.wstx.sr.BasicStreamReader.next(BasicStreamReader.java:1123) [woodstox-core-5.0.3.jar:5.0.3]
at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:197) [jaxb-impl-2.2.3-1.jar:2.2.3]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:366) [jaxb-impl-2.2.3-1.jar:2.2.3]
... 16 more
我还需要定义什么来接受这些字符(UTF-8 除外)还是根本不允许?
非常感谢!
【问题讨论】:
-
您可以在尝试解组之前从您的 XML 中删除所有这些字符(仅 / 但不是 /> 或 >)。这种预处理应该相当简单。
-
@dsp_user 但我需要这个角色。 / 应该是一个可能的值
-
XML 格式仍然错误。 / 应该在您的 XML 中转义。
-
@dsp_user 但我认为 XML 中唯一需要转义的 5 个字符是:“ " ' ' > & & stackoverflow.com/a/1091953/285608
-
没关系,我们都会犯错。
标签: java xsd xml-parsing jaxb jaxb2-maven-plugin