为了设置场景,我目前正在为Android开发一个XML适配器,该适配器将读取我收到的XML文件,并将它们解析到数据库中。我以为我已经解决了这个问题,直到他们突然告诉我,XML文件中的节点可以从一个文件更改到另一个文件,所以我需要构建一种机制来处理丢失的变量。
对此最明显的解决方案是switch()
语句,但它不适用于字符串,所以我开始构建if-then-else
结构。其想法是,它将检查节点的名称,并在此基础上确定如何处理它。很简单,不是吗?
问题是,无论我做什么,我似乎都无法从XML文件中提取我需要的节点的名称。XML文件的结构如下:
<Vehicle>
<Detail>
<VIN>BBB2791276393</VIN>
<RegNo>KN05EAP</RegNo>
<Doors>5</Doors>
</Detail>
</Vehicle>
我需要能够比较的是像"VIN"或"RegNo"这样的标签名称,但我无法找到将它们提取出来的方法。ETA:由于我没有弄清楚,Detail的子节点在XML文件之间会发生变化,我必须在它们出现时处理它们。。。
我使用了一个DOM解析器,并在<Detail>
的基础上提取出一个NodeList
。NodeList.item(0)
为我提供了<Detail>
节点,但如果我尝试将其分解(例如使用getChildNodes()
(,我将无法获得<VIN>
或<RegNo>
的标签名称。事实上,我似乎找不到任何可以用来确定基于原始名称的节点的引用。
有人有什么想法吗?
好的。。正如您所解释的,您可以访问Detail标签。。试着这样做。。。
// Getting VIN of Detail
if (element.getElementsByTagName("VIN").getLength() > 0) {
childNode = element.getElementsByTagName("VIN").item(0); //Get all the elements one by one
String VIN = childNode.getFirstChild().getNodeValue();
}
您可以为Detail的所有子标签执行此操作。。。希望这能帮助你。。!!!
子节点名称:
Element elem = (Element)nodeList.item(0);
Node child;
if( elem != null){
if (elem.hasChildNodes()){
for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
if( child.getNodeType() == Node.ELEMENT_NODE ){
Log.i("fff", child.getNodeName());
}
}
}
}
为了获得节点的值,我使用了这个getValue((方法(我忘了在哪里找到了这个解决方案,所以很遗憾,我不能把它归功于制造它的人(:
public String getValue(Element item, String str) {
NodeList n = item.getElementsByTagName(str);
return this.getElementValue(n.item(0));
}
public final String getElementValue( Node elem ) {
Node child;
if( elem != null){
if (elem.hasChildNodes()){
for( child = elem.getFirstChild(); child != null; child = child.getNextSibling() ){
if( child.getNodeType() == Node.TEXT_NODE ){
//child.getNodeName();
return child.getNodeValue();
}
}
}
}
return null;
}