仅在某些标记可​​用时才解析XML响应

时间:2014-03-26 08:10:33

标签: java xml xml-parsing

返回了两种类型的物品:

<LineStatus ID="0" StatusDetails="">
    <BranchDisruptions/>
    <Line ID="1" Name="Bakerloo"/>
    <Status ID="GS" CssClass="GoodService" Description="Good Service" IsActive="true">   
       <StatusType ID="1" Description="Line"/>
    </Status>
 </LineStatus>

<LineStatus ID="5" StatusDetails="Severe delays">
    <BranchDisruptions>
        <BranchDisruption>
           <StationTo ID="106" Name="High Barnet"/>
           <StationFrom ID="35" Name="Camden Town"/>
           <Status ID="SD" CssClass="DisruptedService" Description="Severe Delays" IsActive="true">
           <StatusType ID="1" Description="Line"/>
           </Status>
        </BranchDisruption>
    </BranchDisruptions>
     <Line ID="5" Name="Northern"/>
       <Status ID="SD" CssClass="DisruptedService" Description="Severe Delays" IsActive="true">
         <StatusType ID="1" Description="Line"/>
      </Status>
</LineStatus>

如您所见,第二个元素也填充了BranchDisruptions详细信息。 我需要在解析XML响应后构建三个ArrayList<String>,一个包含所有LineStatus StatusDetails,一个包含Line Name,一个包含所有Line Status Description

我的问题是我想忽略<BranchDisruption>中的状态,因为我不需要它。到目前为止,我已设法获取包含所有名称的列表,但包含状态的列表也包含分支状态。

nodelist = doc.getElementsByTagName("LineStatus");
for (int i = 0; i < nodelist.getLength(); i++)
      {
     Node node = nodelist.item(i);
     Element Te = (Element) node;
     listStatusDetails.add(Te.getAttribute("StatusDetails"));

        NodeList ttLine = Te.getElementsByTagName("Line");
        for (int j = 0; j < ttLine.getLength(); j++)
        {
           Node nNode = ttLine.item(j);
           Element eElement = (Element) nNode;
           listLineNames.add(eElement.getAttribute("Name"));
        }
     }

        NodeList ttStatus = Te.getElementsByTagName("Status");
        for (int j = 0; j < ttStatus.getLength(); j++)
        {
           Node nNode = ttStatus.item(j);
           Element eElement = (Element) nNode;
           listLineStatuses.add(eElement.getAttribute("Description"));
        }
     }
  }

正如您在上面的代码中所看到的,状态既来自Lines,也来自BranchDisruption。

我想忽略解析,所以只解析Line from Line。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

我认为使用xmlparser来解析xml reponce.its更好更容易,而不是这个。

这是xmlParsing的最佳演示示例:

reference link

我希望它对你有用。

答案 1 :(得分:0)

您可以使用您的代码并将其更改为:

    NodeList ttStatus = Te.getElementsByTagName("Status");
    for (int j = 0; j < ttStatus.getLength(); j++)
    {
       Node nNode = ttStatus.item(j);
       if (nNode.getParentNode().getNodeName().equals("LineStatus")) {
           Element eElement = (Element) nNode;
           listLineStatuses.add(eElement.getAttribute("Description"));
       }
    }

然而,您收到的XML并不是很好用。 id应始终在XML文档中是唯一的,不应用作结果的标志。如果您可以操作提供程序来更改其XML,请执行。

如果你成功了,你应该能够使用getElementById,这将更快,更准确。目前的XML并不能使它成为一种选择。

答案 2 :(得分:0)

XPath可用于获取仅需要的状态:

    XPath path = XPathFactory.newInstance().newXPath();
    NodeList nl=(NodeList)path.evaluate("LineStatus/Status/@Description", doc, XPathConstants.NODESET);
    for (int i = 0; i < nl.getLength(); i++) {
        System.out.println(nl.item(i).getNodeValue());
    }