2013-04-02 96 views
9

我知道这被问了很多次,但我仍然无法使它工作。我将xml字符串转换为Document对象,然后解析它。下面是代码:java xml将节点转换为元素

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.*; 

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder; 
try 
{ 
    builder = factory.newDocumentBuilder(); 
    Document document = builder.parse(new InputSource(new StringReader(result))); 
    Node head = document.getFirstChild(); 
    if(head != null) 
    {     
    NodeList airportList = head.getChildNodes();  
    for(int i=0; i<airportList.getLength(); i++) { 
    Node n = airportList.item(i);       
    Element airportElem = (Element)n; 
    } 
} 
catch (Exception e) { 
    e.printStackTrace(); 
} 

当我投的Node对象n至元我得到一个异常java.lang.ClassCastException:org.apache.harmony.xml.dom.TextImpl不能转换为org.w3c。 dom.Element。当我检查节点对象的节点类型时,它表示Node.TEXT_NODE。我相信它应该是Node.ELEMENT_NODE。我对吗?

那么,我如何将Node转换为Element,所以我可以做类似element.getAttribute(“attrName”)的操作。

这里是我的XML:

<?xml version="1.0" encoding="utf-8" ?> 
<ArrayOfCity xmlns:xsd="http://www.w3.org/2001/XMLSchema"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > 
<City> 
    <strName>Abu Dhabi</strName> 
    <strCode>AUH</strCode> 
</City> 
<City> 
    <strName>Amsterdam</strName> 
    <strCode>AMS</strCode> 
</City> 
<City> 
    <strName>Antalya</strName> 
    <strCode>AYT</strCode> 
</City> 
<City> 
    <strName>Bangkok</strName> 
    <strCode>BKK</strCode> 
</City> 
</ArrayOfCity> 

提前感谢!

+2

我们如何是为了知道第一个节点是否应该是一个元素或者文本,当你的避风港不显示我们的文件?我强烈怀疑解析器是正确的,虽然...我怀疑你可能只是想跳过非元素节点。 –

+0

我已经添加了xml。节点应该是一个元素,而不是文本。我对么? – Student

+1

是的,但我认为你会发现它''和''之间的文本元素(可能只是一个换行符) - 每个''和''之间。 –

回答

6

当我投的Node对象n至元我得到一个异常java.lang.ClassCastException:org.apache.harmony.xml.dom.TextImpl不能转换为org.w3c.dom.Element中。当我检查节点对象的节点类型时,它表示Node.TEXT_NODE。我相信它应该是Node.ELEMENT_NODE。我对吗?

可能不是,解析器可能是正确的。这意味着你正在解析的一些节点是text nodes。例如:

<foo>bar</foo> 

在上文中,我们有一个包含一个文本节点的foo元件。 (文本节点包含文本"bar"

同样,考虑:

<foo> 
    <bar>baz</bar> 
</foo> 

如果你的XML文档字面上看起来像上面的,它包含了根元素foo这些子节点(以):

  • 在它
  • bar元件
  • 一些空白文本节点
  • 在它

注意,bar元素不是foo的第一个孩子一些空白文本节点。如果是这样的:

<foo><bar>baz</bar></foo> 

然后bar元素将是foo的第一个孩子。

17

我想你需要的东西是这样的:

NodeList airportList = head.getChildNodes(); 
for (int i = 0; i < airportList.getLength(); i++) { 
    Node n = airportList.item(i); 
    if (n.getNodeType() == Node.ELEMENT_NODE) { 
     Element elem = (Element) n; 
    } 
} 
4

你也可以尝试“保护”你的施法

Node n = airportList.item(i); 
if (n instanceof Element) 
{       
    Element airportElem = (Element)n; 
    // ... 
} 

,但被别人当作指出,你有文本节点,那些韩元”牛逼通过这种方法来铸造,确保你不需要他们使用的条件有不同的代码来处理它们