gpt4 book ai didi

java - java中如何设置XML中节点的文本内容?

转载 作者:太空宇宙 更新时间:2023-11-04 14:16:46 26 4
gpt4 key购买 nike

考虑这个例子:

<PARAMETER FIELD="QUERYSTORE_TYPE" LABEL="Query Type" NAME="QUERYSTORE" NUM_ROW="40">
<DEFAULT>""</DEFAULT>
</PARAMETER>

<PARAMETER FIELD="GUESS_SCHEMA" LABEL="Guess Schema" NAME="GUESS_SCHEMA" NUM_ROW="40">
<DEFAULT></DEFAULT>
</PARAMETER>

<PARAMETER FIELD="MEMO_SQL" LABEL="Query" NAME="QUERY" NUM_ROW="45" REQUIRED="true">
<DEFAULT>"select id, name from employee"</DEFAULT>
</PARAMETER>

现在我必须删除 DEFAULT 标记内容中的所有双引号。我尝试执行以下操作

NodeList nList = doc.getElementsByTagName("PARAMETER");

for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);

if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement = (Element) nNode;
NodeList nl = nNode.getChildNodes();

for (int k = 0; k < nl.getLength(); k++) {
if (nl.item(k).getNodeName().equals("DEFAULT")) {
nl.item(k).setTextContent(nl.item(k).getTextContent().replaceAll("\"", ""));
}
}
}
}

但它不起作用。当我打开 XML 文件时,它仍然包含那些双引号。我该怎么做?

而且只要有双引号,我就必须向 PARAMETER 元素添加另一个属性,即使用指示 DEFAULT 标记中是否有双引号的值进行编码。即

<PARAMETER FIELD="QUERYSTORE_TYPE" LABEL="Query Type" NAME="QUERYSTORE" NUM_ROW="40" encode ="true">
<DEFAULT></DEFAULT>
</PARAMETER>

<PARAMETER FIELD="GUESS_SCHEMA" LABEL="Guess Schema" NAME="GUESS_SCHEMA" NUM_ROW="40" encode = "false">
<DEFAULT></DEFAULT>
</PARAMETER>

<PARAMETER FIELD="MEMO_SQL" LABEL="Query" NAME="QUERY" NUM_ROW="45" REQUIRED="true" encode="true">
<DEFAULT>select id, name from employee</DEFAULT>
</PARAMETER>

我该怎么做?

最佳答案

你的代码没有任何问题。您是否尝试覆盖该文件或写入新文件?

foo.xml

<PARAMETERS>
<PARAMETER FIELD="QUERYSTORE_TYPE" LABEL="Query Type" NAME="QUERYSTORE"
NUM_ROW="40">
<DEFAULT>""</DEFAULT>
</PARAMETER>

<PARAMETER FIELD="GUESS_SCHEMA" LABEL="Guess Schema" NAME="GUESS_SCHEMA"
NUM_ROW="40">
<DEFAULT></DEFAULT>
</PARAMETER>

<PARAMETER FIELD="MEMO_SQL" LABEL="Query" NAME="QUERY"
NUM_ROW="45" REQUIRED="true">
<DEFAULT>"select id, name from employee"</DEFAULT>
</PARAMETER>
</PARAMETERS>

XmlUnquoteExample.java

import java.io.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class XmlUnquoteExample {
public static void main(String[] args) {
Document doc;

try {
doc = readXmlFile("resources/foo.xml");
System.out.println("<!-- BEFORE -->");
printDocument(doc, System.out);
removeQuotes(doc);
System.out.println("<!-- AFTER -->");
printDocument(doc, System.out);
} catch (Exception e) {
e.printStackTrace();
}
}

public static Document readXmlFile(String filename)
throws ParserConfigurationException, SAXException, IOException {
InputStream is;
DocumentBuilderFactory factory;
DocumentBuilder builder;

is = ClassLoader.getSystemResourceAsStream(filename);
factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
builder = factory.newDocumentBuilder();
return builder.parse(new ByteArrayInputStream(toByteArray(is, 16384)));
}

public static byte[] toByteArray(InputStream is, int bufferSize) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[bufferSize];

while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}

public static void printDocument(Document doc, OutputStream out)
throws IOException, TransformerException {
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(
"{http://xml.apache.org/xslt}indent-amount", "4");

transformer.transform(new DOMSource(doc), new StreamResult(
new OutputStreamWriter(out, "UTF-8")));
}

public static void removeQuotes(Document doc) {
NodeList nList = doc.getElementsByTagName("PARAMETER");

for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = (Node) nList.item(temp);

if (nNode.getNodeType() == Node.ELEMENT_NODE) {
NodeList nl = nNode.getChildNodes();

for (int k = 0; k < nl.getLength(); k++) {
if (nl.item(k).getNodeName().equals("DEFAULT")) {
nl.item(k).setTextContent(
nl.item(k).getTextContent()
.replaceAll("\"", ""));
}
}
}
}
}
}

输出

<!-- BEFORE -->
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PARAMETERS>
<PARAMETER FIELD="QUERYSTORE_TYPE" LABEL="Query Type" NAME="QUERYSTORE" NUM_ROW="40">
<DEFAULT>""</DEFAULT>
</PARAMETER>

<PARAMETER FIELD="GUESS_SCHEMA" LABEL="Guess Schema" NAME="GUESS_SCHEMA" NUM_ROW="40">
<DEFAULT/>
</PARAMETER>

<PARAMETER FIELD="MEMO_SQL" LABEL="Query" NAME="QUERY" NUM_ROW="45" REQUIRED="true">
<DEFAULT>"select id, name from employee"</DEFAULT>
</PARAMETER>
</PARAMETERS>
<!-- AFTER -->
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<PARAMETERS>
<PARAMETER FIELD="QUERYSTORE_TYPE" LABEL="Query Type" NAME="QUERYSTORE" NUM_ROW="40">
<DEFAULT/>
</PARAMETER>

<PARAMETER FIELD="GUESS_SCHEMA" LABEL="Guess Schema" NAME="GUESS_SCHEMA" NUM_ROW="40">
<DEFAULT/>
</PARAMETER>

<PARAMETER FIELD="MEMO_SQL" LABEL="Query" NAME="QUERY" NUM_ROW="45" REQUIRED="true">
<DEFAULT>select id, name from employee</DEFAULT>
</PARAMETER>
</PARAMETERS>

关于java - java中如何设置XML中节点的文本内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27634705/

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