2014-11-12 5 views
1

У меня есть файл XML с подобными тегами ->Синтаксический и обновление XML с помощью SAX-парсер в Java

<properties> 
    <definition> 
     <name>IP</name> 
     <description></description> 
     <defaultValue>10.1.1.1</defaultValue> 
    </definition> 
    <definition> 
     <name>Name</name> 
     <description></description> 
     <defaultValue>MyName</defaultValue> 
    </definition> 
    <definition> 
     <name>Environment</name> 
     <description></description> 
     <defaultValue>Production</defaultValue> 
    </definition> 
</properties> 

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

Можно ли это использовать с помощью анализатора SAX?

Не могли бы вы указать мне правильную документацию?

До сих пор я разбирал документ, но когда я обновляю defaultValue, он обновляет все defaultValues. Я не знаю, как разобрать точный тег значения по умолчанию.

+0

Если трансформация вашего XML является вашей целью, вы можете воспользоваться технологией, специально нацеленной на достижение этой цели. А именно, [XSLT] (http://en.wikipedia.org/wiki/XSLT). – predi

ответ

2

Все, что возможно с SAX, это просто waaaaay сложнее, чем должно быть. Это довольно старая школа, и есть много простых способов сделать это (JAXB, XQuery, XPath, DOM и т. Д.).

Это позволяет делать это с помощью SAX.

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

Это довольно грубый способ разбора документа и обновления соответствующего узла с помощью SAX. В основном я проверяю, когда мы ударяем элемент со значением, которое вы хотите обновить (Environment), и устанавливаете флаг, чтобы, когда мы добираемся до содержимого узла defaultValue, обратный вызов символов позволяет мне удалить существующее значение и заменить его на новое значение.

import java.io.StringReader; 
import java.util.Arrays; 

import javax.xml.parsers.SAXParser; 
import javax.xml.parsers.SAXParserFactory; 

import org.xml.sax.Attributes; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 
import org.xml.sax.XMLReader; 
import org.xml.sax.helpers.DefaultHandler; 

public class Q26897496 extends DefaultHandler { 

    public static String xmlDoc = "<?xml version='1.0'?>" 
      + "<properties>" 
      + " <definition>" 
      + "  <name>IP</name>" 
      + "  <description></description>" 
      + "  <defaultValue>10.1.1.1</defaultValue>" 
      + " </definition>" 
      + " <definition>" 
      + "  <name>Name</name>" 
      + "  <description></description>" 
      + "  <defaultValue>MyName</defaultValue>" 
      + " </definition>" 
      + " <definition>" 
      + "  <name>Environment</name>" 
      + "  <description></description>" 
      + "  <defaultValue>Production</defaultValue>" 
      + " </definition>" 
      + "</properties>"; 


    String elementName; 
    boolean mark = false; 
    char[] updatedDoc; 

    public static void main(String[] args) { 

     Q26897496 q = new Q26897496(); 
     try { 
      q.parse(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public Q26897496() { 

    } 

    public void parse() throws Exception { 
     SAXParserFactory spf = SAXParserFactory.newInstance(); 
     spf.setNamespaceAware(true); 
     SAXParser saxParser = spf.newSAXParser(); 
     XMLReader xml = saxParser.getXMLReader(); 
     xml.setContentHandler(this); 
     xml.parse(new InputSource(new StringReader(xmlDoc))); 

     System.out.println("new xml: \n" + new String(updatedDoc)); 
    } 

    @Override 
    public void startDocument() throws SAXException { 
     System.out.println("starting"); 

    } 

    @Override 
    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     this.elementName = localName; 
    } 

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

     String value = new String(ch).substring(start, start + length); 
     if (elementName.equals("name")) { 
      if (value.equals("Environment")) { 
       this.mark = true; 
      } 
     } 

     if (elementName.equals("defaultValue") && mark == true) { 
      // update 
      String tmpDoc = new String(ch); 
      String leading = tmpDoc.substring(0, start); 
      String trailing = tmpDoc.substring(start + length, tmpDoc.length()); 
      this.updatedDoc = (leading + "NewValueForDefaulValue" + trailing).toCharArray(); 
      mark = false; 
     } 
    } 
} 
+0

, и есть много других примеров этого, поэтому http://stackoverflow.com/questions/13687799/parsing-and-modification-xml-string-with-sax-parser – stringy05

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