代码之家  ›  专栏  ›  技术社区  ›  Daniel Rodríguez

JAXB XML unmarshal with/in属性值

  •  0
  • Daniel Rodríguez  · 技术社区  · 8 年前

    当一个属性的值中包含一些特殊字符,如“/”时,我在解组XML文件时遇到了一个问题,例如:

    <field name = "test" value = "test&/"/>
    

    属性值在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
    

    1 回复  |  直到 8 年前
        1
  •  0
  •   Daniel Rodríguez    8 年前

    这里的问题实际上不是/字符,而是&在它之前。/本身是可以的,但是&需要逃脱。由于错误消息,我太专注于/了。

    <field name = "test" value = "test&amp;/"/>
    
    推荐文章