解析 XSD 文件以从复杂类型中获取元素名称
Parse XSD file to get element names from complex type
我正在尝试获取 XSD 文件中的元素名称。假设我有这个 xsd:
<xsd:complexType name="SomethingOne">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Time" type="xsd:string"/>
<xsd:element name="Location" type="xsd:string"/>
<xsd:element name="Building" type="xsd:string"/>
<xsd:element name="Comments" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SomethingTwo">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Time" type="xsd:string"/>
<xsd:element name="Location" type="xsd:string"/>
<xsd:element name="Building" type="xsd:string"/>
<xsd:element name="Phone" type="xsd:string"/>
<xsd:element name="Device" type="xsd:string"/>
<xsd:element name="Protocol" type="xsd:string"/>
<xsd:element name="Comments" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
对于 SomethingOne
,我想打印出所有元素名称(例如 Id
、Time
、Location
等)。这是我的 Java 代码:
public void parse(String id) {
try {
// Setup classes to parse XSD file for complex types
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new FileInputStream("filepath.xsd"));
// Given the id, go to correct place in XSD to get all the parameters
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList result = (NodeList) xpath.compile(getExpression(id)).evaluate(doc, XPathConstants.NODESET);
for(int i = 0; i < result.getLength(); i++)
{
Element e = (Element) result.item(i);
System.out.println(e.getAttribute("name") + " = " + e.getNodeValue());
}
} catch(Exception e) {
e.printStackTrace();
}
}
// Get XSD Expression
private String getExpression(String id) {
String expression = "";
switch(id)
{
case "99":
expression = "//xsd:complexType[@name='SomethingOne']//xsd:element";
break;
default:
System.out.println("\n Invalid id");
break;
}
return expression;
}
我遇到的问题是 for
循环。 result.getLength()
returns 0
。我不知道为什么。任何帮助将不胜感激,谢谢!
你的xsd有效吗?我在线测试了该表达式并且它有效,但在您的 xsd 中只有一个小的解决方法。
我只是将代码放在 xsd:schema 标签中:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified">
<xsd:complexType name="SomethingOne">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Time" type="xsd:string"/>
<xsd:element name="Location" type="xsd:string"/>
<xsd:element name="Building" type="xsd:string"/>
<xsd:element name="Comments" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SomethingTwo">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Time" type="xsd:string"/>
<xsd:element name="Location" type="xsd:string"/>
<xsd:element name="Building" type="xsd:string"/>
<xsd:element name="Phone" type="xsd:string"/>
<xsd:element name="Device" type="xsd:string"/>
<xsd:element name="Protocol" type="xsd:string"/>
<xsd:element name="Comments" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
xpath 查询似乎可以接受这些更改。此处测试:http://www.freeformatter.com/xpath-tester.html
更新:
删除 xpath 查询中的 "xsd:":
//complexType[@name='SomethingOne']//element
我在一个 Java 项目中对其进行了测试并返回了 5 个结果。
我正在尝试获取 XSD 文件中的元素名称。假设我有这个 xsd:
<xsd:complexType name="SomethingOne">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Time" type="xsd:string"/>
<xsd:element name="Location" type="xsd:string"/>
<xsd:element name="Building" type="xsd:string"/>
<xsd:element name="Comments" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SomethingTwo">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Time" type="xsd:string"/>
<xsd:element name="Location" type="xsd:string"/>
<xsd:element name="Building" type="xsd:string"/>
<xsd:element name="Phone" type="xsd:string"/>
<xsd:element name="Device" type="xsd:string"/>
<xsd:element name="Protocol" type="xsd:string"/>
<xsd:element name="Comments" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
对于 SomethingOne
,我想打印出所有元素名称(例如 Id
、Time
、Location
等)。这是我的 Java 代码:
public void parse(String id) {
try {
// Setup classes to parse XSD file for complex types
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new FileInputStream("filepath.xsd"));
// Given the id, go to correct place in XSD to get all the parameters
XPath xpath = XPathFactory.newInstance().newXPath();
NodeList result = (NodeList) xpath.compile(getExpression(id)).evaluate(doc, XPathConstants.NODESET);
for(int i = 0; i < result.getLength(); i++)
{
Element e = (Element) result.item(i);
System.out.println(e.getAttribute("name") + " = " + e.getNodeValue());
}
} catch(Exception e) {
e.printStackTrace();
}
}
// Get XSD Expression
private String getExpression(String id) {
String expression = "";
switch(id)
{
case "99":
expression = "//xsd:complexType[@name='SomethingOne']//xsd:element";
break;
default:
System.out.println("\n Invalid id");
break;
}
return expression;
}
我遇到的问题是 for
循环。 result.getLength()
returns 0
。我不知道为什么。任何帮助将不胜感激,谢谢!
你的xsd有效吗?我在线测试了该表达式并且它有效,但在您的 xsd 中只有一个小的解决方法。
我只是将代码放在 xsd:schema 标签中:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified">
<xsd:complexType name="SomethingOne">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Time" type="xsd:string"/>
<xsd:element name="Location" type="xsd:string"/>
<xsd:element name="Building" type="xsd:string"/>
<xsd:element name="Comments" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="SomethingTwo">
<xsd:sequence>
<xsd:element name="Id" type="xsd:int"/>
<xsd:element name="Time" type="xsd:string"/>
<xsd:element name="Location" type="xsd:string"/>
<xsd:element name="Building" type="xsd:string"/>
<xsd:element name="Phone" type="xsd:string"/>
<xsd:element name="Device" type="xsd:string"/>
<xsd:element name="Protocol" type="xsd:string"/>
<xsd:element name="Comments" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
xpath 查询似乎可以接受这些更改。此处测试:http://www.freeformatter.com/xpath-tester.html
更新:
删除 xpath 查询中的 "xsd:":
//complexType[@name='SomethingOne']//element
我在一个 Java 项目中对其进行了测试并返回了 5 个结果。