我一直试图在Android上构建一个应用程序,该应用程序从Labview RestFUL服务器获取数据。到目前为止,我已经能够完成一些合理的工作,但是当我需要从数组中解析数据时(名为Probability),我就陷入了困境。显示XML代码片段:在Java中使用相同的父代和子代标签解析XML
<Response>
<Terminal>
<Name>Push</Name>
<Value>77.678193</Value>
</Terminal>
<Terminal>
<Name>Pull</Name>
<Value>153.621879</Value>
</Terminal>
(snip)
<Terminal>
<Name>Probability</Name>
<Value>
<DimSize>480</DimSize>
<Name>effect</Name>
<Value>0.000000</Value>
<Name>effect</Name>
<Value>0.000000</Value>
<Name>effect</Name>
(snip)
</Value>
</Terminal>
</Response>
正如您所见,LabView使用嵌套值标记。
我一直在使用标准的XML解析技术,并没有奏效(如果我在父节点中搜索“值”,它会返回相同的父节点)。所以我开始使用更多创造性的技术,但没有好的结果。例如下面的代码,我只需要调用if (lName == "Value")
就可以将lName设置为Null。
有什么建议吗?
InputStream firstData = null;
URL url = null;
try {
url = new URL(urlString);
} catch (MalformedURLException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
int response = -1;
try {
URLConnection conn = url.openConnection();
Document doc = null;
DocumentBuilderFactory dbf =
DocumentBuilderFactory.newInstance();
DocumentBuilder db;
HttpURLConnection httpConn = (HttpURLConnection) conn;
httpConn.setAllowUserInteraction(false);
httpConn.setInstanceFollowRedirects(true);
httpConn.setRequestMethod("GET");
httpConn.connect();
response = httpConn.getResponseCode();
if (response == HttpURLConnection.HTTP_OK) {
firstData = httpConn.getInputStream();
}
try {
db = dbf.newDocumentBuilder();
doc = db.parse(firstData);
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
doc.getDocumentElement().normalize();
NodeList terminalNodes = doc.getElementsByTagName("Terminal");
for (int i = 0; i < 4; i++) {
Node singleTerminalNode = terminalNodes.item(i);
if (singleTerminalNode.getNodeType() == Node.ELEMENT_NODE)
{
Element firstLevel = (Element) singleTerminalNode;
NodeList value1Nodes = (firstLevel).getElementsByTagName("Value");
Element value1Element = (Element) value1Nodes.item(0);
if (i<FIRST_SET){
NodeList digit1Nodes = ((Node) value1Element).getChildNodes();
hinde[i] = Double.parseDouble(((Node) digit1Nodes.item(0)).getNodeValue());
}
else
{
NodeList value1Children = ((Node) value1Element).getChildNodes();
int henry = value1Children.getLength();
int counter = 0;
String lName;
for (int j = 0; i < henry; j++){
Element digit2Element = (Element) value1Children.item(j);
lName = digit2Element.getLocalName();
if (lName == "Value")
{
NodeList digit2Nodes = ((Node) digit2Element).getChildNodes();
sweep[counter] = Double.parseDouble(((Node) digit2Nodes.item(0)).getNodeValue());
counter ++;
}
}
}
}
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
我不知道这是你的问题,但你不应该使用==比较字符串。改用.equals。 ==只有在边是同一个对象时才是true,如果两个东西是等价对象(即具有相同的字符串值),.equals为真。 – 2011-03-18 20:04:43
嗨,Mayra,它甚至没有达到字符串比较:调试时,可悲的事实仍然是,lName为空(我在IF语句中使用触发的断点) – Rasman 2011-03-18 20:22:21
您可能更容易使用SAX而不是DOM解析此时间,并获得更好的启动性能。只要确保不要使用'=='来比较那里的字符串,就像@Mayra指出的那样。 – CommonsWare 2011-03-18 20:46:48