簡體   English   中英

在Java中使用SAX解析器解析和更新xml

[英]Parsing and updating xml using SAX parser in java

我有一個帶有類似標簽的xml文件->

<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>

我想用名稱“ Environment”更新定義的默認值。

使用SAX解析器可以做到這一點嗎?

您能給我指出適當的文檔嗎?

到目前為止,我已經解析了文檔,但是當我更新defaultValue時,它將更新所有defaultValues。 我不知道如何解析確切的默認值標簽。

SAX可以做任何事情,這比必須要做的要困難得多。 這是一門古老的學校,並且有許多更簡便的方法(JAXB,XQuery,XPath,DOM等)。

就是說讓我們用SAX來做。

聽起來您遇到的問題是您沒有在整個文檔中跟蹤進度狀態。 SAX偶然遇到文檔中的事件時,只需進行回調即可工作

這是解析文檔並使用SAX更新相關節點的相當粗略的方法。 基本上,我正在檢查何時擊中要更新的值的元素(環境)並設置一個標志,以便當我們到達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;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM