2014-09-03 2 views
0

dom4j.Node обрабатывать файлы xml, и у меня была проблема с Map-подобными структурами. Я следовал структуры документа:dom4j.Node итерации карт элементов

<Party> 
    <Identifier>1113ddbed7b54890abfe2f8c9754d689</Identifier> 
    <Address> 
    </Address> 
<Contact> 
    <ContactInfo> 
     <Key>IPS</Key> 
     <Value>null</Value> 
     <Key>keyTwo</Key> 
     <Value>1234</Value> 
     (...) 
    </ContactInfo> 
</Contact> 
</Party> 

И моя цель состоит в том, чтобы получить значение для keyTwo элемента. Как получить этот элемент с гибким, не жестко-кодированным способом?

Моя первая мысль была что-то вроде этого:

//parent node is father element 
    Node parentDocument = parentNode.selectSingleNode("ContactInfo"); 
    List<Node> nodesKeys = contactNode.selectNodes("Key"); 
    List<Node> nodesValues = contactNode.selectNodes("Value"); 

    for(int i=0; i<nodesKeys.size(); i++){ 

      if(nodesKeys.get(i).selectSingleNode("Key").equals("keyTwo")){ 
       return nodesValues.get(i); 
      } 
    } 

Но я не уверен, если это хороший подход, особенно если список ключей и значений будет в правильном порядке.

+0

Каков размер xml-файл? –

+0

Не большой, что-то вроде 1-2 сотен строк – Mazeryt

+0

, если у вас есть файл bigfile> некоторые мегабайты, вы можете комбинировать Xpath + Dom4j и потоковые узлы, каждый анализируемый узел должен быть отделен от дерева дерева после обработки, чтобы освободить RAM. –

ответ

1

Вот полный рабочий пример:

Maven: PoM

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.sofrecom</groupId> 
    <artifactId>XmlProcessing</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <packaging>jar</packaging> 
    <dependencies> 
     <dependency> 
      <groupId>dom4j</groupId> 
      <artifactId>dom4j</artifactId> 
      <version>1.6.1</version> 
     </dependency> 
     <dependency> 
      <groupId>jaxen</groupId> 
      <artifactId>jaxen</artifactId> 
      <version>1.1.6</version> 
     </dependency> 
    </dependencies> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <maven.compiler.source>1.7</maven.compiler.source> 
     <maven.compiler.target>1.7</maven.compiler.target> 
    </properties> 
</project> 

Java Main:

package xmlprocessing; 

import org.dom4j.Document; 
import org.dom4j.DocumentException; 
import org.dom4j.Node; 
import org.dom4j.io.SAXReader; 

/** 
* 
* @author z.benrhouma 
*/ 
public class Main { 

    public static void main(String... args) { 

     try { 
      Document document = parse("src/main/resources/file.xml"); 
      Node node = document.selectSingleNode("//Party/Contact/ContactInfo/Key[text()='keyTwo']/following-sibling::Value[1]"); 
      System.out.println(node.getText()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


    } 
    public static Document parse(String path) throws DocumentException { 
     SAXReader reader = new SAXReader(); 
     Document document = reader.read(path); 
     return document; 
    } 
} 

XML файл:

<?xml version="1.0" encoding="UTF-8"?> 
<Party> 
    <Identifier>1113ddbed7b54890abfe2f8c9754d689</Identifier> 
    <Address> 
    </Address> 
    <Contact> 
     <ContactInfo> 
      <Key>IPS</Key> 
      <Value>null</Value> 
      <Key>keyTwo</Key> 
      <Value>1234</Value> 

     </ContactInfo> 
    </Contact> 
</Party> 
0

Я думаю, что dom4j + Xpath решит проблему, вам просто нужно добавить зависимость jaxen.

// ContactInfo Element having key = 'keyTwo' 
Node node = document.selectSingleNode("//Party/Contact/ContactInfo[Key = 'keyTwo']"); 
// retrieve data from the selected node 
String value = node... ; 

Maven:

<dependency> 
    <groupId>jaxen</groupId> 
    <artifactId>jaxen</artifactId> 
    <version>1.1.6</version> 
</dependency> 

Приветствия.

+0

Какой Узел будет возвращен из .selectSingleNode ("// Party/Contact/ContactInfo/[Key = 'keyTwo']"); ? Если будет только keyTwo? или пара ключTwo ? – Mazeryt

+0

// Party/Contact/ContactInfo/==> ContactInfo –

+0

зависит от того, как вы отформатируете запрос Xpath –

Смежные вопросы