2011-04-03 97 views
2

当我试图从我的servlet的doGet方法访问我的xml数据时,它只输出值到白色空格,包括整个值。java dom getTextContent()问题

XML文件:

<RealEstate> 
    <Property> 
      <Type>Apartment</Type> 
      <Bedrooms>2</Bedrooms> 
      <Bathrooms>2</Bathrooms> 
      <Suburb>Bondi Junction</Suburb> 
      <Rent>1000</Rent> 
    </Property> 
</RealEstate> 

我再打电话从Java Servlet中的郊区doGet

Node suburb1 = doc.getElementsByTagName("Suburb").item(i); 
out.println("<tr><td>Suburb</td>" + "<td>"+suburb1.getTextContent()+"</td></tr>"); 

而且只输出 “邦迪”,而不是 “邦迪结”

有人知道为什么吗?

回答

2

尝试迭代suburb1的子节点和所有包含文本节点的串联值。在大多数DOM实现中,getTextContent()方法非常成问题。它很少做开发人员认为它应该做的事情。

4

我试过你的代码,你的xml,它打印出我的整个文本内容,很奇怪。无论如何,Node#getTextContext方法返回当前节点及其后代的文本内容。 我建议你使用node.getFirstChild().getNodeValue(),它打印出你节点的文本内容,而不是其后代。另一种方法是遍历Suburbs节点的子节点。 你也应该看看here

这是我的主要打印出两次相同的文字,同时使用getFirstChild().getNodeValue()getChildNodes().item(i).getNodeValue()

public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException { 

    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
    Document doc = docBuilder.parse(new File("dom.xml")); 

    NodeList nodeList = doc.getElementsByTagName("Suburb"); 
    for (int i = 0; i < nodeList.getLength(); i++) { 
     Node node = nodeList.item(i); 
     if (node.hasChildNodes()) { 

      System.out.println("<tr><td>Suburb</td>" + "<td>"+node.getFirstChild().getNodeValue()+"</td></tr>"); 

      NodeList textNodeList = node.getChildNodes(); 
      StringBuilder textBuilder = new StringBuilder(); 
      for (int j = 0; j < textNodeList.getLength(); j++) { 
       Node textNode = textNodeList.item(j); 
       if (textNode.getNodeType() == Node.TEXT_NODE) { 
        textBuilder.append(textNode.getNodeValue()); 
       } 
      } 
      System.out.println("<tr><td>Suburb</td>" + "<td>" + textBuilder.toString() + "</td></tr>"); 
     } 
    } 
} 

这是我与你的XML输出:

<tr><td>Suburb</td><td>Bondi Junction</td></tr> 
<tr><td>Suburb</td><td>Bondi Junction</td></tr>