2012-05-24 9 views
7

属性名と一致するXMLファイルからXML属性をすべて削除するためにJavaを使用しようとしています。私はこの時点で立ち往生しています。このコードの最後に、私はループスルーしながら各ノードの属性値を取得することができますが、ノードから属性を完全に削除する方法を見つけることはできません。何か案は?ここで 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

答えて

3

試してみてください。

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); 
} 
+0

ドキュメント(のorg.w3c.dom.Document)のこのバージョンは、私が必要となるものですremoveAttributeByName(String)メソッドを、持っていないようです。 – djangofan

+0

@djangofan申し訳ありませんが、私は十分な注意を払っていません。要素を取得してから、属性を削除してください。 – tibtof

+0

私はあなたの提案を試みたが、それはうまくいかなかった。変更を反映するために私の質問に私のコードを更新しました。私はあなたを助けてくれるアップヴォートをお渡しします。あるいは、それはうまくいって、間違ったオブジェクトを印刷しているだけかもしれません。研究が必要... – djangofan

1
NamedNodeMap attributes = node.getAttributes(); 
attributes.removeNamedItem(attName); 
関連する問題