【问题标题】:Parsing and updating xml using SAX parser in java在java中使用SAX解析器解析和更新xml
【发布时间】:2014-11-12 22:02:10
【问题描述】:

我有一个带有相似标签的 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>

我想用 name : Environment 更新定义的默认值。

是否可以使用 SAX 解析器来做到这一点?

能否请您指出正确的文档?

到目前为止,我已经解析了文档,但是当我更新 defaultValue 时,它​​会更新所有 defaultValues。我不知道如何解析确切的默认值标签。

【问题讨论】:

  • 如果转换 XML 是您的目标,那么您可能会受益于使用专门针对此目标的技术。即XSLT.

标签: java saxparser


【解决方案1】:

使用 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;
        }
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2011-05-31
  • 2011-04-30
  • 2017-08-19
  • 2017-07-27
  • 2011-06-17
  • 1970-01-01
相关资源
最近更新 更多