2016-04-29 8 views
3
<root> 
<parent> 
    <child1> 30</child1> 
    <child2> 30</child2> 
    <child3> 30</child3> 
</parent> 
<parent> 
    <child1> 20</child1> 
    <child2> 30</child2> 
    <child3> 30</child3> 
</parent> 
<parent> 
    <child1> 30</child1> 
    <child2> 30</child2> 
    <child3> 30</child3> 
</parent> 
</root> 

Я действительно новичок в мире кодирования и саксофон разборе .. Рассмотрим выше XML, что я требуется есть. .. на основании значения тега child1, если он больше 20, только тогда я хотел бы проанализировать оставшиеся дочерние теги (child2 и child3), в противном случае я хотел бы перейти к следующему родительскому тегу.Как пропустить родительский тег, основанный на значении дочернего тега в XML с помощью SAX Разбор Parser

Может ли кто-нибудь предположить, что было бы идеальным способом сделать это?

+0

Почему саксофон только для огромного XML? –

+0

Да, это для огромного xml, а также уже существующий код, я пытаюсь внести некоторые изменения. –

+0

Насколько огромен огромный? 100 мб или 100 гб? –

ответ

1

Нечто подобное:

... 
private boolean skipChildren; 
private StringBuilder buf = new StringBuilder(); 
... 

@Override 
public void startElement(String uri, String localName, String qName, 
     Attributes attributes) throws SAXException { 
    if (qName.equals("parent")) { 
     skipChildren = false; 
     ... 
    } else if (qName.equals("child1")) { 
     buf.setLength(0); 
     ... 
    } else if (qName.startsWith("child")) { 
     if (!skipChildren) { 
      buf.setLength(0); 
      ... 
     } 
    } 
} 

@Override 
public void endElement(String uri, String localName, String qName) 
     throws SAXException { 
    if (qName.equals("parent")) { 
     ... 
    } else if (qName.equals("child1")) { 
     int value = Integer.parseInt(buf.toString().trim()); 
     if (value <= 20) { 
      skipChildren = true; 
     } 
     ... 
    } else if (qName.startsWith("child")) { 
     if (!skipChildren) { 
      int value = Integer.parseInt(buf.toString().trim()); 
      doSomethingWith(value); 
     } 
    } 
} 

@Override 
public void characters(char[] ch, int start, int length) { 
    if (!skipChildren) { 
     buf.append(ch, start, length); 
    } 
} 
+0

Спасибо @ Морис Перри. Похоже, это сработает. –

0

Ниже приведен код для выполнения вашей задачи с vtd-xml, это состояние искусства в технологии обработки XML, и является гораздо более эффективным и проще написать, чем SAX. .. ключ, используя выражение XPath, чтобы отфильтровать только те узлы, представляющие интерес ... далее this paper, что дает вам нагрузок причин, чтобы избежать SAX синтаксического анализа по возможности

Processing XML with Java – A Performance Benchmark

import com.ximpleware.*; 
public class conditionalSelection { 
    public static void main(String s[]) throws VTDException{ 
     VTDGen vg = new VTDGen(); 
     if(!vg.parseFile("d:\\xml\\condition.xml", false)) // disable namespace 
      return; 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     ap.selectXPath("/root/parent[child1>20]"); // the xpath selecting all parents with child1>20 
     int i=0,j=0; 
     while((i=ap.evalXPath())!=-1){ 
      // now move the cursor to child2 and child3 
      if(vn.toElement(VTDNav.FC,"child2")){ 
       j = vn.getText(); 
       if (j!=-1)//make sure the text node exist 
        System.out.println(" child2's text node is ==>"+ vn.toString(j)); 
       vn.toElement(VTDNav.P); 
      } 
      if(vn.toElement(VTDNav.FC,"child3")){ 
       j = vn.getText(); 
       if (j!=-1)//make sure the text node exist 
        System.out.println(" child3's text node is ==>"+ vn.toString(j)); 
       vn.toElement(VTDNav.P); 
      } 
     } 
    }