Java:访问xml节点atrributes值

时间:2016-03-24 10:48:25

标签: java xml file attributes

所以,我有一个XML文件,我想阅读它并获取客户端实体(由id& name标识)并将它们添加到列表中并进一步对它们执行一些操作。我的XML看起来像:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<clients>
<entity class="Domain.Client">
    <field name="id" type="java.lang.String" value="1"/>
    <field name="name" type="java.lang.String" value="Bia"/>
</entity>
<entity class="Domain.Client">
    <field name="id" type="java.lang.String" value="2"/>
    <field name="name" type="java.lang.String" value="Ana"/>
</entity>

读取XML的代码如下:

public List<Client> loadEntities() {
    List<Client> entities = new ArrayList<>();
    XmlHelper docXml = new XmlHelper();       
    Document document = docXml.loadDocument(fileName);  // this function returns a Document
    document.getDocumentElement().normalize();
    Element root = document.getDocumentElement();

    NodeList clients = root.getChildNodes();
    for (int i=0; i < clientElements.getLength(); i++) 
    {
        Node clientElement = clientElements.item(i);
            if (clientElement.getNodeType() != Node.ELEMENT_NODE) 
            {
               // ignoring element due to wrong node type
               continue;
            }
            Element client = (Element) clientElement;
            String name = client.getElementsByTagName("name")
                                .item(i)
                                .getTextContent();

            int id = Integer.parseInt(client.getElementsByTagName("id")
                            .item(i)
                            .getTextContent());

            Client newClient = new Client(id, name);
            entities.add(newClient);

    }

    return entities;
}

但是,我得到&#34; java.lang.NullPointerException&#34; ......有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

getElementsByTagName的Javadoc说:

以文档顺序返回具有给定标记名称的所有元素的NodeList,并包含在文档中。

您有没有元素,标记名称为 name ,标记名称是<之后的名称。 您有<entity><field>个标记名称。

要访问名称 属性的值,您可以执行以下操作(未经测试的代码)

NodeList cNodeList = root.getElementsByTagName("field");

for(int i = 0; i < cNodeList.getLength(); ++i) {
    Node cNode = cNodeList.item(i);
    Node dAttribute = cNode.getAttributes().getNamedItem("name");
    String nameValue = dAttribute.getNodeValue()
    System.out.println(nameValue);
}

通常,在出现异常时发布完整的堆栈跟踪。

edit2 :我修复了示例代码,现在它应该按预期工作。

NodeList entityNodeList = xmlDoc.getDocumentElement().getElementsByTagName("entity");

for(int i = 0; i < entityNodeList.getLength(); ++i) {
    String name = null;
    int id = 0;
    // Read all fields in the entity
    Element entity = (Element) entityNodeList.item(i);
    NodeList entityFields = entity.getElementsByTagName("field");
    for (int j = 0; j < entityFields.getLength(); ++j) {
        Node fieldNode = entityFields.item(j);
        Node dAttribute = fieldNode.getAttributes().getNamedItem("name");
        String attributeName = dAttribute.getNodeValue();
        System.out.println(attributeName);
        if (attributeName.equals("id")) {
            id = Integer.parseInt(fieldNode.getAttributes().getNamedItem("value").getNodeValue());
        }
        if (attributeName.equals("name")) {
            name = fieldNode.getAttributes().getNamedItem("value").getNodeValue();
        }

    }
    System.out.println("name=" + name + ", id=" + id);

此输出

id
name
name=Bia, id=1
id
name
name=Ana, id=2