【问题标题】:Java XML Parsing of complex xml file复杂xml文件的Java XML解析
【发布时间】:2013-12-20 10:07:41
【问题描述】:

我真的希望你能帮助我解决这个问题...... 我需要从我的 xml 文件中获取特定数据,但我被困在某一点上,我无法弄清楚如何继续......

我想从网络中获取:网络名称; From Codes:mcc和mnc代码; From Settings:名称、id、类型、参数名称和值;

这就是我的xml文件的结构:

<country country="Andorra" isoCode="AD">
    <networks>
        <network name="Mobiland" isMNO="true" ranking="10">
            <codes>
                <code mcc="213" mnc="03" />
            </codes>
            <settings>
                <setting alternativeName="Mobiland AD" ref="s1" name="IAP" id="2266" />
                <setting alternativeName="Mobiland MMS AD" ref="s2" name="MMS" id="2265" />
            </settings>
        </network>
    </networks>
    <settings>
        <setting id="s2" type="mmssetting">
            <parameter name="mms-gprs-access-point-name" value="MMS" />
            <parameter name="mms-gprs-name" value="MMS" />
            <parameter name="mms-gprs-proxy" value="192.168.021.050" />
            <parameter name="mms-gprs-proxy-port" value="9201" />
            <parameter name="mms-url" value="http://mms.ad/mmsc" />
        </setting>
        <setting id="s1" type="iapsetting">
            <parameter name="iap-gprs-access-point-name" value="internet" />
            <parameter name="iap-gprs-name" value="Internet" />
            <parameter name="iap-gprs-url" value="http://google.com" />
        </setting>
    </settings>
</country>

这是我到目前为止所拥有的......我真的无法继续......我在 String content = cNode.getLastChild().getTextContent().trim( );而且我不确定我的做法是否正确.....

public void ReadXML() 抛出 ParserConfigurationException、SAXException、 IOException {

    // Get the DOM Builder Factory
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

    // Get the DOM Builder
    DocumentBuilder builder = factory.newDocumentBuilder();

    // Load and Parse the XML document
    // document contains the complete XML as a Tree.
    Document document = builder.parse("D:\\test.xml");

    List<Apn> empList = new ArrayList<Apn>();

    // Iterating through the nodes and extracting the data.
    NodeList nodeList = document.getDocumentElement().getChildNodes();

    for (int i = 0; i < nodeList.getLength(); i++) {

        Node node = nodeList.item(i);
        if (node instanceof Element) {
            //Apn apn = new Apn();
            System.out.println(node.getAttributes().getNamedItem("country")
                    .getNodeValue());

            NodeList childNodes = node.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node cNode = childNodes.item(j);


                if (cNode instanceof Element) {
                    String content = cNode.getLastChild().getTextContent()
                            .trim();

                    switch (cNode.getNodeName()) {
                    case "networks":
                        System.out.println(content);
                        break;
                    case "setting":
                        System.out.println(content);
                        break;
                    case "codes":
                        System.out.println(content);
                        // emp.location = content;
                        break;
                    }
                }
            }

        }

    }
}

如有任何帮助,将不胜感激!

谢谢!

【问题讨论】:

  • 也许 Castor 项目(一个 OXM 工具)可能对您的任务有用:castor.codehaus.org
  • 你可以写一个xsd并在java对象中转换你的xml吗?
  • 使用 trang 从您的 xml 生成架构文件。 peter-on-java.blogspot.in/2012/10/… 一旦你有了模式文件,你就可以使用 XMl-java 映射框架,如 jaxb 或 castor。一旦你生成了 java 类,你就可以使用这些 java 类将你的 xml 编组/解组为 java 对象,反之亦然。跨度>

标签: java xml parsing


【解决方案1】:

使用 XPath。例如,要获取network 元素的name 属性的值,可以这样做:

InputStream is = this.getClass().getResourceAsStream("country.xml");
InputSource inputSource = new InputSource(is);

XPath xpath = XPathFactory.newInstance().newXPath();

String expression = "/country/networks/network/@name";
NodeList names = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);
for (int i = 0; i < names.getLength(); i++) {
  System.out.println(names.item(i).getNodeValue());
}

输出:

Mobiland

【讨论】:

    【解决方案2】:

    我认为处理如此复杂的 xml 结构最简单的方法是编写一个 xsd schema 并使用 JAXB 将您的 xml 转换为 java 对象

    【讨论】:

      【解决方案3】:

      您可以使用Declarative Stream Mapping (DSM) 流解析库轻松地将复杂的xml 转换为java 类。 DSM 具有非常强大的映射结构和脚本支持

      首先,你必须以yaml格式定义xml数据和你的类字段之间的映射。

      这里是您的 XML 的映射定义。

      result:     
         type: object
         path: /country       
         fields:
             network:          
                type: array
                path: networks/network
                fields:       
                   name: 
                     xml: 
                       attribute: true                 
                   codes:
                     type: array
                     path: codes/code
                     fields:
                       mcc:
                         xml:
                           attribute: true
                       mnc:
                         xml:
                           attribute: true                      
             settings:
                type: array
                path: settings/setting
                fields:       
                   id: 
                     xml:
                       attribute: true
                   type: 
                     xml:
                       attribute: true
                   parameter:
                     type: array
                     fields:
                       name:
                         xml:
                           attribute: true
                       value:
                         xml:
                           attribute: true
      

      解析 XML 的 Java 代码:

      DSM dsm=new DSMBuilder(new File("path/to/mapping.yaml")).setType(DSMBuilder.TYPE.XML).create();
      Object object =  dsm.toObject(xmlFileContent);
      dsm.getObjectMapper().writerWithDefaultPrettyPrinter().writeValue(System.out, object)
      

      这是输出的 json 表示:

      {
        "network" : [ {
          "name" : "Mobiland",
          "codes" : [ {
            "mcc" : "213",
            "mnc" : "03"
          } ]
        } ],
        "settings" : [ {
          "id" : "s2",
          "type" : "mmssetting",
          "parameter" : [ {
            "name" : "mms-gprs-access-point-name",
            "value" : "MMS"
          }, {
            "name" : "mms-gprs-name",
            "value" : "MMS"
          }, {
            "name" : "mms-gprs-proxy",
            "value" : "192.168.021.050"
          }, {
            "name" : "mms-gprs-proxy-port",
            "value" : "9201"
          }, {
            "name" : "mms-url",
            "value" : "http://mms.ad/mmsc"
          } ]
        }, {
          "id" : "s1",
          "type" : "iapsetting",
          "parameter" : [ {
            "name" : "iap-gprs-access-point-name",
            "value" : "internet"
          }, {
            "name" : "iap-gprs-name",
            "value" : "Internet"
          }, {
            "name" : "iap-gprs-url",
            "value" : "http://google.com"
          } ]
        } ]
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-23
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多