解组时,SAX解析器不会忽略bean定义中未包含的元素属性

时间:2019-03-18 15:53:04

标签: java java-8 jaxb sax

我正试图解组该XML文件:

for i in range(n_iteration):
        print("Epoch:", i, "/", n_iteration)
        start = time.time()
        self.train_batch, self.validation_batch = self.get_batch()
        end = time.time()
        print("Time for loading: ",end - start)
        K.set_value(self.batch_source, self.train_batch[0][:self.batch_size])
        K.set_value(self.batch_target, self.train_batch[0][self.batch_size:])

        pred = self.model.predict(self.train_batch[0])

        K.set_value(self.gamma, self.compute_gamma(pred))

        hist = self.model.train_on_batch(self.train_batch[0], self.train_batch[1])

具有以下代码:

<OpposantParcelles>
        <OpposantParcelle>
            <cin>R92107</cin>
            <opposant>
                <cin>R92107</cin>
                <numMarche>xyz1</numMarche>
                <verrou xsi:nil="true" />
            </opposant>
            <num_marche>xyz1</num_marche>
        </OpposantParcelle>
        <OpposantParcelle>
            <cin>R92107</cin>
            <opposant>
                <cin>R92107</cin>
                <numMarche>xyz1</numMarche>
                <verrou xsi:nil="true" />
            </opposant>
            <num_marche>xyz1</num_marche>
        </OpposantParcelle>

但是我收到以下异常,说明元素 JAXBContext jaxbContext = JAXBContext.newInstance(OpposantParcelles.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); OpposantParcelles opposantParcelles = (OpposantParcelles) jaxbUnmarshaller.unmarshal( new File("OpposantParcelles.xml")); System.out.println(opposantParcelles); 的属性xsi的前缀xsi:nil没有绑定。

verrou

问题是我的豆[org.xml.sax.SAXParseException; systemId: file:/D:/Douars/OpposantParcelles.xml; lineNumber: 26; columnNumber: 46; Le préfixe "xsi" de l'attribut "xsi:nil" associé à un type d'élément "verrou" n'est pas lié.] at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:335) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:563) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:249) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171) at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189) at ma.ancfcc.webIFE.utils.UnmarshallClass.main(UnmarshallClass.java:102) Caused by: org.xml.sax.SAXParseException; systemId: file:/D:/Douars/OpposantParcelles.xml; lineNumber: 26; columnNumber: 46; Le préfixe "xsi" de l'attribut "xsi:nil" associé à un type d'élément "verrou" n'est pas lié. at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203) at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:284) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:308) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643) at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243) ... 6 more 中没有包含元素verrou

Opposant

SAX解析器是否应该忽略此元素?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您需要拦截反序列化并提供丢失的名称空间信息。可以使用import com.ctc.wstx.sr.InputElementStack; import javax.xml.XMLConstants; import javax.xml.bind.JAXBContext; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.namespace.NamespaceContext; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.util.StreamReaderDelegate; import java.io.File; import java.io.FileReader; import java.util.List; public class JaxbApp { public static void main(String[] args) throws Exception { File xmlFile = new File("./resource/test.xml").getAbsoluteFile(); JAXBContext jaxbContext = JAXBContext.newInstance(OpposantParcelles.class); XMLInputFactory xif = XMLInputFactory.newFactory(); XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader(xmlFile)); Object unmarshal = jaxbContext.createUnmarshaller().unmarshal(new XsiTypeReader(xsr)); System.out.println(unmarshal); } } class XsiTypeReader extends StreamReaderDelegate { public XsiTypeReader(XMLStreamReader reader) { super(reader); } @Override public NamespaceContext getNamespaceContext() { InputElementStack context = (InputElementStack) super.getNamespaceContext(); context.addNsBinding("xsi", XMLConstants.W3C_XML_SCHEMA_INSTANCE_NS_URI); return context; } } 类来完成。参见以下示例:

     0      3177         5
 3.4275637990000E+33 7.7345239420000E+11 2.3294608630000E+21 2.0879655710000E+05
 1.9252063604938E+06 2.0037575941018E+06-1.0000000000000E+00 0.0000000000000E+00
 0.0000000000000E+00 1.1806662792899E+08 0.0000000000000E+00 1.6258263880000E+00
 0.0000000000000E+00 3.0000000000000E+00 8.7143739363190E-06 1.1806108844692E+08
 1.5216398828085E-04 1.5621014411210E+00 0.0000000000000E+00 2.9999238008221E+00
 1.0979515673726E-05 1.1805809220990E+08 2.4154974448797E-04 1.5621006577022E+00
 0.0000000000000E+00 2.9996256593782E+00 2.1960663497032E-05 1.1803176057951E+08
 9.6633451293816E-04 1.5620942285096E+00 0.0000000000000E+00 2.9994037831384E+00
 2.7670327547614E-05 1.1801096239579E+08 1.5341282126072E-03 1.5620891863088E+00
 0.0000000000000E+00 2.9990524870828E+00 3.4865681847029E-05 1.1797792540807E+08
 2.4357001431448E-03 1.5620811953515E+00 0.0000000000000E+00 2.9984939557312E+00
 4.3934518613971E-05 1.1792547175142E+08 3.8674871654846E-03 1.5620681038247E+00
 0.0000000000000E+00 2.9976271324793E+00