java—如何在xml/xsd中获取属性的元素名

guicsvcw  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(476)

这是我用来解析的xml。

<bookstore>
  <book category="children">
    <title>Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="web">
    <title>Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

这就是它的模式。

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="bookstore">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="book" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="title"/>
              <xs:element type="xs:string" name="author"/>
              <xs:element type="xs:short" name="year"/>
              <xs:element type="xs:float" name="price"/>
            </xs:sequence>
            <xs:attribute type="xs:string" name="category" use="optional"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

我已经使用javax.xml库编写了代码来验证和解析它,并且我能够从xsd获得所有元素名。在这里,我在获取属性的元素名时遇到了一些困难。
例如,在上面的xsd中,我们有一个名为category的属性,在这里我只想得到它的元素名book(我们可以在xml文件中找到它,我看不到它是属性,它的元素是so and so的任何关系)。我怎样才能得到这个值?最后我只想组成一个字符串,类似于这本书。
有谁能建议我怎样才能组成这根绳子吗?提前谢谢。
用于获取属性名称类别的代码。

val attrList = doc.getElementsByTagName("xs:attribute")
val attrName = attrList.item(0).getAttributes.item(0).getNodeValue
8gsdolmq

8gsdolmq1#

可以使用访问属性 @ . 例如,假设我们有:

val bookStoreXml =
  <bookstore>
    <book category="children">
      <title>Harry Potter</title>
      <author>J K. Rowling</author>
      <year>2005</year>
      <price>29.99</price>
    </book>
    <book category="web">
      <title>Learning XML</title>
      <author>Erik T. Ray</author>
      <year>2003</year>
      <price>39.95</price>
    </book>
  </bookstore>

因此,以下是:

(bookStoreXml \ "book").map(_ \ "@category")

将提供:

List(children, web)

代码在scastie运行。您可以在scala上阅读更多关于高级xml解析的内容:深入的xml解析,以及alvinalexander的提取xml标记属性。

ny6fqffe

ny6fqffe2#

对于这个特定的示例,可以使用以下xpath .//*[local-name()='attribute' and @name='category']/ancestor::*[local-name()='element'][1]/@name .
下面是一个在java中使用它的示例:

public static void main(String[] args) throws Exception {
        DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = db.parse(new InputSource(new StringReader(xml)));
        XPathExpression xpath = XPathFactory.newInstance().newXPath().compile(".//*[local-name()='attribute' and @name='category']/ancestor::*[local-name()='element'][1]/@name");
        String name = xpath.evaluate(doc);
        System.out.println(name);
    }

    private static String xml = "<xs:schema attributeFormDefault=\"unqualified\" elementFormDefault=\"qualified\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n"
            + "  <xs:element name=\"bookstore\">\n"
            + "    <xs:complexType>\n"
            + "      <xs:sequence>\n"
            + "        <xs:element name=\"book\" maxOccurs=\"unbounded\" minOccurs=\"0\">\n"
            + "          <xs:complexType>\n"
            + "            <xs:sequence>\n"
            + "              <xs:element type=\"xs:string\" name=\"title\"/>\n"
            + "              <xs:element type=\"xs:string\" name=\"author\"/>\n"
            + "              <xs:element type=\"xs:short\" name=\"year\"/>\n"
            + "              <xs:element type=\"xs:float\" name=\"price\"/>\n"
            + "            </xs:sequence>\n"
            + "            <xs:attribute type=\"xs:string\" name=\"category\" use=\"optional\"/>\n"
            + "          </xs:complexType>\n"
            + "        </xs:element>\n"
            + "      </xs:sequence>\n"
            + "    </xs:complexType>\n"
            + "  </xs:element>\n"
            + "</xs:schema>";

相关问题