2015-06-23 8 views
1

У меня есть простой файл .xml и его нужно разобрать. Файл состоит в следующем:Dom parsing xml problems

<table name="agents"> 
    <row name="agent" password="pass" login="agent" ext_uid="133"/> 
</table> 

Мне нужно получить значения name, password, login, ext_uid для создания БД записи.

То, что я сделал для этого: создана or.w3c.dom.Document:

public Document getDocument(String fileName){ 
     DocumentBuilderFactory f = DocumentBuilderFactory.newInstance(); 
     f.setValidating(false); 
     DocumentBuilder builder = f.newDocumentBuilder();    
     return builder.parse(new File(fileName)); 
    } 

рядом я пытаюсь напечатать значения:

document = getDocument(fileName); 
      NodeList nodes = document.getChildNodes(); 
      for (int i=0; i<nodes.getLength(); i++){ 
       Node node = nodes.item(i); 
       if(node.getNodeType() == Node.ELEMENT_NODE){ 
        NodeList listofNodes = node.getChildNodes(); 
        for(int j=0; j<listofNodes.getLength(); j++){ 
         if(node.getNodeType() == Node.ELEMENT_NODE){ 
          Node childNode = listofNodes.item(j); 
          System.out.println(childNode.getNodeValue()+" " + childNode.getNodeName()); 
         } 
         } 
        } 
       } 

Я использую это, потому что я пытаюсь выяснить, как получить значения: childNode.getNodeValue()+" " + childNode.getNodeName() , но результатом является следующее:

#text 
null row 

#text 

в первом и третьем случаях NodeValue пуст, а во втором случае это null, это означает, что я предполагаю, что NodeValue вообще отсутствует. Итак, мой вопрос в том, как получить значения name, password, login, ext_uid?

ответ

1

<row> элемент не имеет значения, он имеет только атрибуты. Если бы он имел значение, он больше походил бы на <row>this would be the value returned from getNodeValue()</row>.

Один из способов, чтобы получить данные, чтобы перебирать атрибуты XML узла, например:

NamedNodeMap attrs = childNode.getAttributes(); 

if (attrs != null) { 
    for (int k = 0; k < attrs.getLength(); k++) { 
     System.out.println("Attribute: " 
       + attrs.item(k).getNodeName() + " = " 
       + attrs.item(k).getNodeValue()); 
    } 
} 

Выход кода показывает #text за счет возврата каретки (\n символов) в файле примера XML , которые, согласно спецификации, должны быть сохранены. null в примере вывода представляет собой значение пустого узла из значения <row>.

2

childNode.getNodeValue(), очевидно, пустой как пустой тег. Вы должны искать атрибуты

Node childNode = listofNodes.item(j); 

    Element e = (Element)childNode; 
    String name = e.getAttribute("name"); 
    String password= e.getAttribute("password"); 
    String login= e.getAttribute("login"); 
    String ext_uid= e.getAttribute("ext_uid"); 
1

Использование XPath вместо:

XPath xp = XPathFactory.newInstance().newXPath(); 

    System.out.println(xp.evaluate("/table/row/@name", doc)); 
    System.out.println(xp.evaluate("/table/row/@password", doc)); 
    System.out.println(xp.evaluate("/table/row/@login", doc)); 
    System.out.println(xp.evaluate("/table/row/@ext_uid", doc));