gpt4 book ai didi

java - 使用 Java 从与属性名称匹配的 XML 文件中删除所有 xml 属性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:28:26 26 4
gpt4 key购买 nike

我正在尝试使用 Java 从与属性名称匹配的 XML 文件中删除所有 xml 属性。我被困在这一点上。在此代码的底部,我可以在循环时获取每个节点的属性值,但我无法弄清楚如何从节点中完全删除该属性。有什么想法吗?

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.*;
import org.xml.sax.SAXException;


public class StripAttribute {

public static void main(String[] args) {

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
org.w3c.dom.Document doc = null;
NodeList nodes = null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse("a.xml");
nodes = doc.getChildNodes();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
for ( int i = 0; i < nodes.getLength(); i++ ) {
String id = nodes.item(i).getNodeValue();
if ( id.equals("siteKey")) {
Element el = ((Attr) nodes.item(i)).getOwnerElement();
el.removeAttribute(id);
}
}

Transformer transformer;
StreamResult result = null;
try {
transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}
String xmlString = result.getWriter().toString();
System.out.println(xmlString);
}
}

这是我要转换的 XML 示例:

https://gist.github.com/2784907

最佳答案

尝试:

for ( int i = 0; i < nodes.getLength(); i++ ) { 
String id = nodes.item(i).getNodeValue();
if ( id.equals("siteKey")) {
//doc.removeChild(nodes.item(i));
Element el = ((Attr) nodes.item(i)).getOwnerElement();
el.removeAttribute(id);
}
}

查询返回的节点似乎与文档分离,因此 getParentNode 为空。 - 不,它们没有分离,我更新了代码。

我找到了一个 article这表示 XPathExpression 返回的节点仍然附加到文档。

您是原始代码 + 上述更改:

public static void main(String[] args) throws Exception {

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
Document doc = null;
NodeList nodes = null;
Set<String> ids = null;
try {
doc = factory.newDocumentBuilder().parse(new File("d:/a.xml"));

XPathExpression expr = XPathFactory.newInstance().newXPath().compile("//@siteKey");
ids = new HashSet<String>();
nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (XPathExpressionException e) {
e.printStackTrace();
}

for (int i = 0; i < nodes.getLength(); i++) {
String id = nodes.item(i).getNodeValue();
if (id.equals("siteKey")) {
Element el = ((Attr) nodes.item(i)).getOwnerElement();
el.removeAttribute(id);
}
}

int dupes = 0;
for (int i = 0; i < nodes.getLength(); i++) {
String id = nodes.item(i).getNodeValue();
if (ids.contains(id)) {
System.out.format("%s is duplicate\n\n", id);
dupes++;
} else {
ids.add(id);
}
}

System.out.format("Total ids = %d\n Total Duplicates = %d\n", ids.size(), dupes);

Transformer transformer;
StreamResult result = null;
try {
transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
result = new StreamResult(new StringWriter());
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);
} catch (TransformerConfigurationException e) {
e.printStackTrace();
} catch (TransformerFactoryConfigurationError e) {
e.printStackTrace();
} catch (TransformerException e) {
e.printStackTrace();
}

String xmlString = result.getWriter().toString();
System.out.println(xmlString);

}

更新:

for (int i = 0; i < nodes.getLength(); i++) {
String id = nodes.item(i).getNodeValue();
Element el = ((Attr) nodes.item(i)).getOwnerElement();
el.removeAttribute(id);
}

关于java - 使用 Java 从与属性名称匹配的 XML 文件中删除所有 xml 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10743824/

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