java - 解析 XSD 文件以从复杂类型中获取元素名称

标签 java xml parsing xsd

我正在尝试获取 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,我想打印出所有元素名称(例如 IdTimeLocation , ETC...)。这是我的 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() 返回 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个结果。

关于java - 解析 XSD 文件以从复杂类型中获取元素名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37324631/

相关文章:

java - xml类对象使用(lamba->或其他优化的)迭代java获取子节点计数

java - Android Studio 找不到属性 XMLConstants.ACCESS_EXTERNAL_DTD

XML::LibXML 的文本节点父节点概念

ruby-on-rails - 从 Rails 应用程序生成 Microsoft OOXML (docx) 的最佳方法是什么?

JavaCC 初学者 - 如何使程序仅接受没有重复项的情况?

bash - 用于解析 Bash 脚本的 Haskell 库?

java - mockito 测试对抽象执行器的调用

java - 查找下一个预期 token 如果发生错误 ANTLR 3

java - 如何在内存中创建一个新的 java.io.File?

java - 如何加载 html 到 styledocument