返回了两种类型的物品:
<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。
有什么想法吗?
答案 0 :(得分:0)
答案 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());
}