Java DOM xml 不能得到 child

标签 java xml parsing dom nodes

我的 XML 看起来像这样:

<ConnProf ConnProfID="1111">
  <ConnNum>1</ConnNum>
  <IsMSPA>false</IsMSPA>
  <IsArray>false</IsArray>
  <IsDDOR>false</IsDDOR>

  <Subsystem SSID="2222"ConnProfID="3333">
    <SSName>AA</SSName>
    <GenericSSName>AA</GenericSSName>
    <ConnFuncAddr>aaa</ConnFuncAddr>
    <DSSNum>22</DSSNum>
    <isRemoved>false</isRemoved>
  </Subsystem>

  <Subsystem SSID="4444" ConnProfID="5555">
    <SSName>BBBB</SSName>
    <GenericSSName>BB</GenericSSName>
    <ConnFuncAddr>bbbbbb</ConnFuncAddr>
    <DSSNum>44</DSSNum>
    <isRemoved>false</isRemoved>
  </Subsystem>

我在获取 ConnNum、IsMSPA、IsArray 和 IsDDOR 时遇到问题。 我尝试通过以下方式获取 ConnNum:

//get ConnNum
                Node n = doc.getFirstChild();
                if (n.hasChildNodes())
                    System.out.println(n.getFirstChild().getNodeValue());
                else 
                    System.out.println(n.getNodeValue());

但是当我期望 1 时它只返回 null。

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class test 
{
    public static void main(String[] args)
    {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

        try 
        {
            DocumentBuilder db = dbf.newDocumentBuilder();

            for (int i = 1; i <= 8; i++)
            {
                Document doc = db.parse("file" + i + ".xml");

                doc.getDocumentElement ().normalize ();
                System.out.println ("Root element of the doc is " + doc.getDocumentElement().getNodeName());

                //get ConnNum
                Node n = doc.getFirstChild();
                if (n.hasChildNodes())
                    System.out.println(n.getFirstChild().getNodeValue());
                else 
                    System.out.println(n.getNodeValue());

                NodeList listOfSubsystems = doc.getElementsByTagName("Subsystem");
                int totalSubsystems = listOfSubsystems.getLength();

                if (totalSubsystems == 0)
                    continue;
                else
                {
                    System.out.println("Total number of subsystems : " + totalSubsystems + "\n");

                    Dish dish = new Dish();

                    for(int s=0; s < listOfSubsystems.getLength() ; s++)
                    {
                        Node firstPersonNode = listOfSubsystems.item(s);

                        if(firstPersonNode.getNodeType() == Node.ELEMENT_NODE)
                        {
                            Element firstPersonElement = (Element)firstPersonNode;

                            printElement(firstPersonElement, "SSName");
                            printElement(firstPersonElement, "GenericSSName");
                            printElement(firstPersonElement, "ConnFuncAddr");
                            printElement(firstPersonElement, "DSSNum");
                            printElement(firstPersonElement, "SCNum");
                            printElement(firstPersonElement, "SCAcronym");
                            printElement(firstPersonElement, "PassNum");
                            printElement(firstPersonElement, "FzCode");
                            printElement(firstPersonElement, "isRemoved");
                            System.out.println("------------------");
                        }
                    }
                    System.out.println("\n==============================");
                }

            }
        }
        catch(ParserConfigurationException pce) 
        {
            pce.printStackTrace();
        }
        catch(SAXException se) 
        {
            se.printStackTrace();
        }
        catch(IOException ioe) 
        {
            ioe.printStackTrace();
        }
    }   

    public static void printElement(Element a, String name)
    {
        NodeList elementList = a.getElementsByTagName(name);
        Element b = (Element)elementList.item(0);

        if (b != null)
        {
            NodeList list = b.getChildNodes();
            System.out.println( ((Node)list.item(0)).getNodeValue().trim() );
        }
    }
}

最佳答案

也许第一个 child 不是你想的那样。 Whitespace在 XML 中很重要,firstChild 可能实际上是一个文本节点。

Nodes有一个类型,你可以迭代所有的 child 检查 Element 节点类型以获取实际元素的句柄。

编辑: 这将打印您所需要的值。它过滤 Element 节点,然后是每个节点的第一个子节点(包含文本的节点)。

NodeList nodeList = n.getChildNodes();
for (int j = 0; j < nodeList.getLength(); j++) {
    Node childNode = nodeList.item(j);
    if (childNode.getNodeType() == Node.ELEMENT_NODE) {
        System.out.println(childNode.getNodeName() + " " + childNode.getFirstChild().getNodeValue());
    }
}

此外,正如@Steve Townsend 所写的那样,您可以使用 getTextContent()如果您使用的是 Java 1.5 或更高版本,则代替 childNode.getFirstChild().getNodeValue()

关于Java DOM xml 不能得到 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6444597/

相关文章:

java - 如何在 geoTools 中使用 GeometricShapeFactory 在 map 上创建一个圆

arrays - 修改解析的 CSV 文件输出,很快吗?

r - 我想弄清楚如何解析网页

java - Maven 配置文件激活 - 如何定义几个激活条件

java - JTable (BeanTableModel) 不更新/刷新 - Java Swing

javascript - Extjs 将 xml 文件属性加载到存储中

java - 如何使用 xpath 来确定我们选择哪个子元素?

javascript - 如何用 Peg.js 打开文件?

java - Jar 无法加载包含类文件的文件夹

java - SimpleXML框架: element with element or text