2013-08-04 1 views
0

Предполагая, что я получил XML-файл, который разбор им SAX (на Java) в следующем формате:Детей в SAX Парсинге

   <RootElement> 
        <text> blabla </text> 
        <rule1 name="a">1</rule1> 
        <rule2 name="b">2</rule2> 
       </RootElement> 

Как я обратиться к атрибуту имени в каждом правиле? Моя цель - сохранить в txt-файл только правила с именем «a», например. Спасибо

ответ

0

Когда вы читаете XML с помощью анализатора SAX, вы реализуете своего рода ContentHandler (см. http://docs.oracle.com/javase/7/docs/api/org/xml/sax/ContentHandler.html). В вашем ContentHandler метод startElement вызывается, когда парсер входит в «правило1» и «правило2». Один параметр startElement - это атрибуты, которые в основном представляют собой карту имен атрибутов («имя» в вашем примере) к соответствующим значениям.

Некоторые фрагмент кода будет выглядеть следующим образом:

// Handle XML SAX parser events. 
private ContentHandler contentHandler = new ContentHandler() { 
    public void startDocument() throws SAXException {...} 

    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { 
     cdata.setLength(0); 
     if(atts == null) return;    
     // Write out attributes as new rows 
     for(int i = 0; i < atts.getLength(); i++) { 
      System.out.println(atts.getLocalName(i) + ": " + atts.getValue(i)); 
     } 
    } 


    public void characters(char[] ch, int start, int length) throws SAXException {...} 

    public void endElement(String uri, String localName, String qName) throws SAXException {...} 

    // All other events are ignored 
    public void endDocument() throws SAXException {} 
    public void endPrefixMapping(String prefix) throws SAXException {} 
    public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {} 
    public void processingInstruction(String target, String data) throws SAXException {} 
    public void setDocumentLocator(Locator locator) {} 
    public void skippedEntity(String name) throws SAXException {} 
    public void startPrefixMapping(String prefix, String uri) throws SAXException {} 
}; 
+0

Спасибо за быстрый ответ, так и в других словах atts.localName (0) равен "а" и atts.localName (1) равно «б «? –

+0

нет, метод startElement будет вызываться дважды парсером. Один раз для элемента «rule1» и второй раз для «rule2». Оба вызова будут иметь один атрибут в параметре Атрибуты. С atts.getLocalName (0) вы получаете в обоих случаях «имя», которое является именем вашего атрибута. С atts.getValue (0) вы получите «a» в вызове startElement для «rule1» и «b» для второго вызова. – jboi

0

Если вы разбора XML с помощью SAX, вы можете проверить атрибут значения вашего элемента внутри переопределен startElement() метод вашего ContentHandler реализации (за счет расширения DefaultHandler).

public class MySAXHandler extends DefaultHandler { 
    // ... 
    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     // .. other elements .. 
     // process <rule1,2 etc. 
     if (localName.startsWith("rule")) { 
      String value = attributes.getValue("name"); 
      if (value != null && value.equals("a")) { 
       // save this rule 
      } 
     } 
    } 
} 

Ссылка:
Parsing an XML File Using SAX