如何解析 xsd 字符串以使用 java 获取其元素



我需要关于"如何解析 xml 文件及其 xsd 元素的值"的解决方案?

作为我的一个 Web 服务方法调用的结果,我将得到一个 Java 对象,其中包含一个 xsd 作为 Java 字符串。此 xsd 包含许多 xsd:元素。我需要获取一个名为"帐户名称"的元素之一,其中包含帐户名称列表。我需要在这里使用 Java 代码来获取所有这些并存储到一个列表中。在这里:

metadataXsd ----------->
<xsd:schema xmlns:xsd="http://www.w3.org    /2001/XMLSchema">
   <xsd:element name="metadata">
    <xsd:complexType>
  <xsd:sequence>
    <xsd:element id="md_37EE5DE8-996B-0371-A119-61B77FE6ABCF" name="Category" minOccurs="0" maxOccurs="1">
      <xsd:annotation>
        <xsd:documentation/>
        <xsd:appinfo>
          <label>Category</label>
          <key>Category</key>
          <searchable>true</searchable>
          <timeControl>false</timeControl>
          <description>Specify categories where the media content should be published</description>
        </xsd:appinfo>
      </xsd:annotation>
      <xsd:simpleType>
        <xsd:restriction base="listType">
          <xsd:enumeration value="Industries &amp; Solutions"/>
          <xsd:enumeration value="Industries &amp; Solutions - Solutions Topics"/>
          <xsd:enumeration value="Industries &amp; Solutions - Industry Solutions"/>
          <xsd:enumeration value="Industries &amp; Solutions - Business Partners and Alliances"/>
          <xsd:enumeration value="Services"/>
          <xsd:enumeration value="Services - Business Services"/>
          <xsd:enumeration value="Services - IT Services"/>
          <xsd:enumeration value="Services - Outsourcing Services"/>
          <xsd:enumeration value="Services - Training"/>
          <xsd:enumeration value="Services - Additional Services"/>
          <xsd:enumeration value="Products"/>
          <xsd:enumeration value="Products - Software"/>
          <xsd:enumeration value="Products - Systems"/>
          <xsd:enumeration value="Products - Storage"/>
          <xsd:enumeration value="Products - Additional Products"/>
          <xsd:enumeration value="Support &amp; downloads"/>
          <xsd:enumeration value="Support &amp; downloads - Knowledge Center"/>
          <xsd:enumeration value="Support &amp; downloads - Knowledge Center - Education Assistant"/>
          <xsd:enumeration value="Support &amp; downloads - Technical Support"/>
          <xsd:enumeration value="Support &amp; downloads - Developer Support"/>
          <xsd:enumeration value="Support &amp; downloads - Supplier Support"/>
          <xsd:enumeration value="Support &amp; downloads - Former Products"/>
          <xsd:enumeration value="Support &amp; downloads - Downloads"/>
          <xsd:enumeration value="My"/>
          <xsd:enumeration value="Interests"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:element>
    <xsd:element id="md_ACECFC0E-1F3B-8233-17B3-AEB96AF9D030" name="AccountName" minOccurs="0" maxOccurs="1">
      <xsd:annotation>
        <xsd:documentation></xsd:documentation>
        <xsd:appinfo>
          <label>Account Name</label>
          <key>Account Name</key>
          <searchable>true</searchable>
          <timeControl>false</timeControl>
          <description>Specify the account that owns the media content</description>
        </xsd:appinfo>
      </xsd:annotation>
      <xsd:simpleType>
        <xsd:restriction base="listType">
          <xsd:enumeration value="Analytics Business Unit Client Success Sales Eminence"/>
          <xsd:enumeration value="Digital"/>
          <xsd:enumeration value="Enterprise Media Team Enablement"/>
          <xsd:enumeration value="Enterprise Content and eSupport Services"/>
          <xsd:enumeration value="Global Delivery Center"/>
          <xsd:enumeration value="Digital Video Services New York"/>
          <xsd:enumeration value="Enterprise Social Solutions"/>
          <xsd:enumeration value="GBS Knowledge"/>
          <xsd:enumeration value="GPS Technology"/>
          <xsd:enumeration value="Global Private Digital Commercde"/>
          <xsd:enumeration value="Center"/>
          <xsd:enumeration value="mix"/>
          <xsd:enumeration value="Essentials"/>
          <xsd:enumeration value="References"/>
          <xsd:enumeration value="Learning Services"/>
          <xsd:enumeration value="works"/>
          <xsd:enumeration value="Programs &amp; Operations"/>
          <xsd:enumeration value="IBM Digital – CHQ Marketing"/>
          <xsd:enumeration value="Assistant"/>
          <xsd:enumeration value="Content Catalog"/>
          <xsd:enumeration value="Center"/>
          <xsd:enumeration value="books"/>
          <xsd:enumeration value="ser"/>
          <xsd:enumeration value="Marketing and Communications"/>
          <xsd:enumeration value="Middleware Client Success"/>
          <xsd:enumeration value="PW"/>
          <xsd:enumeration value="Enablement"/>
          <xsd:enumeration value="Sales"/>
          <xsd:enumeration value="Systems Unit"/>
          <xsd:enumeration value="Technical"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:element>
    </xsd:schema>

从上面,我只需要获取 AccountName 元素并将其所有值存储为一个列表和进一步的过程。

我尝试了以下将字符串转换为 xml 的代码。

metadataXsd = metadataProfile.xsd;
                    if(metadataXsd != null) {
                        System.out.println("metadataXsd ----------->"+metadataXsd);
                            finalXmlDoc = stringToDom(metadataXsd);
                            System.out.println("finalXmlDoc ----------->"+finalXmlDoc);
                        }
                    }
public static Document stringToDom(String xmlSource) throws SAXException, ParserConfigurationException, IOException, TransformerException{
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
        DocumentBuilder builder;  
        try 
        {  
            builder = factory.newDocumentBuilder();  
            Document doc = builder.parse( new InputSource(new StringReader(xmlSource))); 
            TransformerFactory tranFactory = TransformerFactory.newInstance();
            Transformer aTransformer = tranFactory.newTransformer();
            Source src = new DOMSource( doc );
            Result dest = new StreamResult( new File( "C:/AccountNames.xml" ) );
            System.out.println("Destination xml -------->"+dest);
            aTransformer.transform( src, dest );
            Document doc1 = builder.parse (new File("C:/AccountNames.xml")); 
            NodeList list = doc1.getElementsByTagName("xsd:element"); 
            for(int i = 0 ; i < list.getLength(); i++)
            {
                Element first = (Element)list.item(i);

            }
            return doc;
        } catch (Exception e) {  
            e.printStackTrace();  
        } 
        return null;
    }

现在我需要将所有值作为 Java 列表获取。请帮我解决这个问题。

这是我问题的解决方案。希望这对某人有所帮助。

public static Document stringToDom(String xmlSource) throws SAXException, ParserConfigurationException, IOException, TransformerException{
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();  
        DocumentBuilder builder;  
        NodeList nodeList = null;
        List<String> accountNamesList = new ArrayList<String>();
        try 
        {  
            builder = factory.newDocumentBuilder();  
            Document doc = builder.parse(new InputSource(new StringReader(xmlSource))); 
            TransformerFactory tranFactory = TransformerFactory.newInstance();
            Transformer aTransformer = tranFactory.newTransformer();
            Source src = new DOMSource(doc);
            Result dest = new StreamResult(new File("C:/AccountNames.xml" ) );
            aTransformer.transform( src, dest );
            Document doc1 = builder.parse (new File("C:/AccountNames.xml")); 
            NodeList list = doc1.getElementsByTagName("xsd:element");
            for(int i = 0 ; i < list.getLength(); i++)
            {
                Element first = (Element)list.item(i);
                if(first.hasAttributes()) {
                    String attrname = first.getAttribute("name");
                    if(attrname.equalsIgnoreCase("AccountName")) {
                        NodeList list1 = first.getElementsByTagName("xsd:enumeration");
                        for(int j=0;j<list1.getLength();j++) {
                            Element sec = (Element)list1.item(j);
                            if(sec.hasAttributes()) {
                                String attr = sec.getAttribute("value");
                                System.out.println(attr);
                                accountNamesList.add(attr);
                            }
                        }
                    }
                 }
             }
            System.out.println("accountNamesList.size()"+accountNamesList.size());
            return null;
        } catch (Exception e) {  
            e.printStackTrace();  
        } 
        return null;
    }

谢谢拉贾亚

使用具有所需谓词的 XPath 表达式(您需要 XPathFactory)

*//xsd:element[@name="AccountName"]//xsd:restriction[@base="listType"]

最新更新