試してみてください。
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はnullです。 - いいえ、彼らは分離されていません、私はコードを更新しました。
XPathExpression
によって返されたノードが依然としてドキュメントにアタッチされていることを示すarticleが見つかりました。
あなたは、元のコード+上記の変更だ:
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);
}
更新:
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashSet;
import java.util.Set;
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 javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
public class StripAttributes {
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("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++) {
System.out.println("."); //progress indicator
Element el = ((Attr) nodes.item(i)).getOwnerElement();
if (el.hasAttribute("siteKey")) el.removeAttribute("siteKey");
}
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);
}
ドキュメント(のorg.w3c.dom.Document)のこのバージョンは、私が必要となるものですremoveAttributeByName(String)メソッドを、持っていないようです。 – djangofan
@djangofan申し訳ありませんが、私は十分な注意を払っていません。要素を取得してから、属性を削除してください。 – tibtof
私はあなたの提案を試みたが、それはうまくいかなかった。変更を反映するために私の質問に私のコードを更新しました。私はあなたを助けてくれるアップヴォートをお渡しします。あるいは、それはうまくいって、間違ったオブジェクトを印刷しているだけかもしれません。研究が必要... – djangofan