2015-06-30 6 views
1

Я хочу, чтобы извлечь только выбранные теги из файла XML:Xml условного синтаксического анализа с использованием Java

<Shape> 
    <ShapeType>H2</ShapeType> 
    <Annotation> 
     <Properties> 
      <PropertyValue PropertyName="field_label">label.modelSeriesCd</PropertyValue> 
      <PropertyValue PropertyName="ContainerType">conditionContainer</PropertyValue> 
     </Properties> 
    </Annotation> 
    <FootnoteNumber>1</FootnoteNumber> 
    <Name>label.modelSeriesCd</Name> 
    <Rectangle> 
     <Rectangle X="14" Y="94" Width="43" Height="12" /> 
    </Rectangle> 
</Shape> 
<Shape> 
    <ShapeType>H2</ShapeType> 
    <Annotation> 
     <Properties> 
      <PropertyValue PropertyName="field_label">label.modelSeriesMd</PropertyValue> 
      <PropertyValue PropertyName="ContainerType">mContainer</PropertyValue> 
     </Properties> 
    </Annotation> 
    <FootnoteNumber>1</FootnoteNumber> 
    <Name>label.modelSeriesCd</Name> 
    <Rectangle> 
     <Rectangle X="14" Y="94" Width="43" Height="12" /> 
    </Rectangle> 
</Shape> 

Я хочу, чтобы извлечь только те теги, которые имеет «conditionContainer» в качестве значения «PropertyValue» и все теги внутри тега Я пытаюсь ниже код:

private static void visitChildNodes(NodeList nList) 
{ 
    for (int index = 0; index < nList.getLength(); index++) 
    { 
     Node node = nList.item(index); 
     if (node.getNodeType() == Node.ELEMENT_NODE) 
     { 
      if(node.getNodeName().equalsIgnoreCase("shape")) 
       System.out.println("Node Name = " + node.getNodeName() + "; Value = " + node.getTextContent()); 

пожалуйста предложить мне способ сделать это.

+0

Прочитайте этот вопрос - http://stackoverflow.com/questions/2811001/how-to-read-xml-using- xpath-in-java – adatapost

+0

Не упоминается там, как итерировать или искать внутри . строка "if (node.getNodeName(). equalsIgnoreCase (" shape "))" в моем коде можно искать тег "shape", но .. Я не понимаю, как читать внутри для других тегов ... – SOP

+0

Как показано в моем xml, есть несколько тегов внутри тега , и мое требование - искать «conditionContainer» и избегать всех других тегов – SOP

ответ

2

Предлагаю рекурсивный поиск по вашему объекту Document, так как то, что вы ищете, находится на нескольких уровнях.

Сделайте функцию, которая рекурсивно называет себя передачей того узла, в котором вы сейчас находитесь, с тем, какой тег вы ищете, и значением, которое должен иметь этот тег.

Что-то вроде ...

public static void main(String[] args) throws Exception { 
    String xml 
      = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" 
      + "<Shapes>\n" 
      + " <Shape>\n" 
      + "  <ShapeType>H2</ShapeType>\n" 
      + "  <Annotation>\n" 
      + "   <Properties>\n" 
      + "    <PropertyValue PropertyName=\"field_label\">label.modelSeriesCd</PropertyValue>\n" 
      + "    <PropertyValue PropertyName=\"ContainerType\">conditionContainer</PropertyValue>\n" 
      + "   </Properties>\n" 
      + "  </Annotation>\n" 
      + "  <FootnoteNumber>1</FootnoteNumber>\n" 
      + "  <Name>label.modelSeriesCd</Name>\n" 
      + "  <Rectangle>\n" 
      + "   <Rectangle X=\"14\" Y=\"94\" Width=\"43\" Height=\"12\" />\n" 
      + "  </Rectangle>\n" 
      + " </Shape>\n" 
      + " <Shape>\n" 
      + "  <ShapeType>H2</ShapeType>\n" 
      + "  <Annotation>\n" 
      + "   <Properties>\n" 
      + "    <PropertyValue PropertyName=\"field_label\">label.modelSeriesMd</PropertyValue>\n" 
      + "    <PropertyValue PropertyName=\"ContainerType\">mContainer</PropertyValue>\n" 
      + "   </Properties>\n" 
      + "  </Annotation>\n" 
      + "  <FootnoteNumber>1</FootnoteNumber>\n" 
      + "  <Name>label.modelSeriesCd</Name>\n" 
      + "  <Rectangle>\n" 
      + "   <Rectangle X=\"14\" Y=\"94\" Width=\"43\" Height=\"12\" />\n" 
      + "  </Rectangle>\n" 
      + " </Shape>\n" 
      + "</Shapes>"; 

    Document xmlDocument = DocumentBuilderFactory 
      .newInstance() 
      .newDocumentBuilder() 
      .parse(new InputSource(new ByteArrayInputStream(xml.getBytes("utf-8")))); 

    Node node = findPropertyTagAndValue(xmlDocument.getFirstChild(), "PropertyValue", "conditionContainer"); 
    if (node != null) { 
     System.out.println("Node Name = " + node.getNodeName() + "; Value = " + node.getTextContent()); 
    } 
} 

public static Node findPropertyTagAndValue(Node node, String propertyTag, String propertyValue) { 
    if (node == null) { 
     // The node we're looking for does not exist 
     return null; 
    } else if (node.getNodeType() != Node.ELEMENT_NODE) { 
     // Move to the next sibling node 
     return findPropertyTagAndValue(node.getNextSibling(), propertyTag, propertyValue); 
    } else if (node.getNodeName().equalsIgnoreCase(propertyTag) && node.getTextContent().equalsIgnoreCase(propertyValue)) { 
     // We found the node we are looking for 
     return node; 
    } else if (node.hasChildNodes()) { 
     // Check into the child nodes 
     Node childNode = findPropertyTagAndValue(node.getFirstChild(), propertyTag, propertyValue); 
     if (childNode == null) { 
      // Nothing found in child node, so move to next sibling 
      childNode = findPropertyTagAndValue(node.getNextSibling(), propertyTag, propertyValue); 
     } 
     return childNode; 
    } else { 
     // Move to the next sibling 
     return findPropertyTagAndValue(node.getNextSibling(), propertyTag, propertyValue); 
    } 
} 

Результаты:

Node Name = PropertyValue; Value = conditionContainer 
Смежные вопросы