gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:40:31 24 4
gpt4 key购买 nike

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

我想用名称:环境更新定义的默认值。

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

您能给我指出正确的文档吗?

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

最佳答案

SAX 一切皆有可能,只是比它必须的要困难得多。这是相当老派的方法,有很多更简单的方法可以做到这一点(JAXB、XQuery、XPath、DOM 等)。

那就是说让我们用 SAX 来做吧。

听起来您遇到的问题是您没有通过文档跟踪进度状态。 SAX 只是在偶然发现文档中的事件时进行回调来工作

这是一种相当粗略的解析文档并使用 SAX 更新相关节点的方法。基本上,我正在检查何时点击具有要更新的值(环境)的元素并设置一个标志,以便当我们到达 defaultValue 节点的内容时,字符回调允许我删除现有值并将其替换为新的值(value)。

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

关于java - 在java中使用SAX解析器解析和更新xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26897496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com