【发布时间】:2021-07-20 04:15:30
【问题描述】:
我有一个名为 input.xml 的 xml 文件
它包含以下代码
<?xml version="1.0"?>
<tests xmlns="http://www.example.com/Report"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/Report input.xsd">
<test id="1">
<coverage>65</coverage>
<usedFramework>Junit4</usedFramework>
<typeTest>Integration</typeTest>
</test>
<test id="2">
<coverage>35</coverage>
<usedFramework>Junit5</usedFramework>
<typeTest>Module</typeTest>
</test>
<test id="3">
<coverage>45</coverage>
<usedFramework>Mockito</usedFramework>
<typeTest>Integration</typeTest>
</test>
</tests>
我还有名为 input.std 的 XML 架构 XML Schema 文件如下所示
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.example.com/Report"
xmlns="http://www.example.com/Report"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="tests">
<xs:complexType>
<xs:sequence>
<xs:element name="test" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="coverage" type="xs:positiveInteger"/>
<xs:element name="usedFramework" type="xs:string"/>
<xs:element name="typeTest" type="xs:string"/>
</xs:sequence>
<xs:attribute name="id" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
接下来的代码会写在java上
try {
File schemaFile = new File("input.xsd");
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(schemaFile);
File inputXml = new File(xmlPath);
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
factory.setSchema(schema);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(inputXml);
List<Test> list = new ArrayList<>();
NodeList tests = document.getElementsByTagName("test");
for(int i=0;i< tests.getLength();i++){
Element element = (Element) tests.item(i);
if(element.getNodeType()==Node.ELEMENT_NODE){
int coverage = Integer.parseInt(element.getElementsByTagName("coverage").item(0).getTextContent());
int id = Integer.parseInt(element.getAttribute("id"));
String usedFramework = (element.getElementsByTagName("usedFramework").item(0).getTextContent());
String typeTest = (element).getElementsByTagName("typeTest").item(0).getTextContent();
list.add(new Test(id,coverage,usedFramework,typeTest));
}
}
list.sort(Comparator.comparing(Test::getCoverage));
list.forEach(System.out::println);
}catch (ParserConfigurationException | IOException | SAXException e){
Logger.getLogger(XmlReader.class.getName()).log(Level.INFO,e.getMessage());
}
那么我哪里出错了?我查看了“如何正确引用本地 XML Schema 文件?”在不同的问题上,没有看到任何错误,你能帮我解决它们吗?
【问题讨论】:
-
请尝试为您的代码中的输入 XML 文件和架构提供完全限定的路径。
-
在您的描述中,您有“input._std_”,而在您的代码中,它是“input._xsd_”。这只是一个错字吗?你确定路径是正确的吗?例如,它可能存储在“resources/input.xsd”下?
-
我已经发现错误了。我必须调用 DocumentBuilderFactory 的方法 setNamespaceAware 并将 true 作为参数传递
标签: java xml xsd xml-parsing domparser