2017-02-06 7 views
0

В настоящее время у меня есть интересный многослойный вложенный XML, который я хочу извлечь из использования Java.Оптимальный способ извлечь значение из соседнего узла во вложенном XML с использованием Java

Все узлы в этом XML имеют общие теги, и каждый тег имеет общее ключевое слово.

Значение, которое я хочу извлечь, - это много слоев глубоко, и способ идентифицировать его не по его ключевому слову, которое является ключевым словом «NumericalValue» (есть много узлов с одним и тем же ключевым словом).

Существует над ним узел (тот же слой, но есть> = 1 узел над ним), который имеет общее ключевое слово «WordRepresentation» (есть много узлов с одним и тем же ключевым словом) и значение «Идентификатор клиента». Мы точно знаем, что если существует значение «Идентификатор клиента», один или несколько узлов ниже, мы найдем ключевое слово «NumericalValue» и значение.

Итак, логика для извлечения значения, которое я хочу: сначала разверните вложенный XML, пока не найду уровень, содержащий значение «Идентификатор клиента», а затем как-то запомните этот уровень и на том же уровне, продолжайте навигацию к следующий узел, пока не найду ключевое слово «NumericValue», и запишите значение.

Есть ли хороший способ или хороший инструмент для поиска внутри вложенного XML для определенного значения и для перехода на один уровень для второго поиска?

Ниже приведен пример XML:

<xml> 
<layer 1> 
    <layer 2> 
    </layer 2> 
    <layer 2> 
     <layer 3> 
       <layer 4> 
        <layer 5> 
         <layer 6> 
          <layer 7 keyword=WordRepresentaion> 
            <Value>Customer ID</Value> 
          </layer 7> 
          ... 
          <layer 7 keyword=NumbericalValue> 
            <Value>453</Value> 
          </layer7> 
          ... 

         </layer 6> 

        </layer 5> 
       </layer 4> 
     </layer 3> 


    </layer 2> 
    ... 

    ... 
    <layer 2> 
    </layer 2> 
    <layer 2> 
    </layer 2> 
</layer 1> 

Спасибо за вашу помощь

ответ

1

Я не уверен, если я понимаю, именно то, что вы пытаетесь сделать, но вы можете использовать jsoup для проанализировать XML. Вот пример:

String xml = "<xml>\n<layer 1>\n <layer 2>\n </layer 2>\n <layer 2>\n   <layer 3>\n    <layer 4>\n     <layer 5>\n      <layer 6>\n        <layer 7 keyword=WordRepresentaion>\n         <Value>Customer ID</Value>\n        </layer 7>\n        <layer 7 keyword=NumbericalValue>\n         <Value>453</Value>\n        </layer7>\n      </layer 6>\n\n     </layer 5>\n    </layer 4>\n   </layer 3>\n </layer 2>\n <layer 2>\n </layer 2>\n <layer 2>\n </layer 2>\n</layer 1>\n</xml>"; 
    Document doc = Jsoup.parse(xml); 

    Elements elms = doc.select("Value:contains(Customer ID)"); // get all the elements that are about the searched one 
    if (elms.size() > 0) { 
     Element wrapper = elms.first().parent(); // get the first one's parent 
     Element layer = wrapper.parent(); 
     Elements layerChildren = layer.getElementsByIndexGreaterThan(wrapper.elementSiblingIndex()); // get all elements in the layer that are below the reference element 
     for (Element e : layerChildren) { 
      if (e.attr("keyword").equals("NumbericalValue")) { // check to see if this is the searched element. 
       System.out.println("Got the element:\n" + e.outerHtml()); 
      } 
     } 
    } 

Вот другой подход:

Elements els = doc.select("[keyword=NumbericalValue]"); 

    for (Element e : els) { 
     int index = e.siblingIndex(); 
     Elements elementsAbove = e.parent().getElementsByIndexLessThan(index); 
     for (Element above : elementsAbove) { 
      // Check if this node has an inner node with the value "Customer ID" 
      if (above.select("Value:contains(Customer ID)").size() > 0) { 
       System.out.println("FOUND A MATCH:\n" + e.outerHtml()); 
       break; 
      } 
     } 
    } 

В этом примере все keyword= NumbericalValue выбраны и внутри цикла мы смотрим на элемент над ним, чтобы увидеть, если у них есть их значение установлено на Customer ID

+0

Спасибо за ваш ответ. Чтобы немного уточнить, я пытаюсь извлечь значение узла с ключевым словом «NumericalValue». Но поскольку есть много узлов с этим ключевым словом, я должен посмотреть один или несколько узлов над ним на одном уровне, чтобы увидеть, есть ли еще один узел со значением «Идентификатор клиента». – 000000000000000000000

+1

@ 000000000000000000000 Я думаю, что пример кода в моем ответе делает это. Другим подходом будет поиск непосредственно для узлов «keyword = NumericalValue» и просмотр узлов над ним, чтобы увидеть, есть ли у них значение «Идентификатор клиента». Я отправлю пример, который делает это в ближайшее время. – Titus

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

  • Нет связанных вопросов^_^