我正试图解组该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解析器是否应该忽略此元素?我该如何解决这个问题?
答案 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