2012-04-19 18 views
2

特定のxml要素をリストの先頭に移動します。xmlファイル内の新しい位置にxml要素を移動する

XML入力:

<?xml version="1.0" encoding="UTF-8"?> 
<Values>  
    <Elem Value="1"/>  
    <Elem Value="2"/> 
    <Elem Value="3"/> 
</Values> 

所望の結果:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Values>  
    <Elem Value="2"/> 
    <Elem Value="1"/>  
    <Elem Value="3"/> 
</Values> 

これは私のコードである:

String valueToFind = "2"; 

File mFile = new File("C:\\xml.xml"); 
DocumentBuilder builder; 
try { 
    builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 

    Document document = builder.parse(mFile); 

    NodeList nodeList = document.getElementsByTagName("Elem"); 
    Element element = null; 

    for (int i = 0; i < nodeList.getLength(); i++) { 
    element = (Element) nodeList.item(i); 
    String value = element.getAttribute("Value"); 

    if (valueToFind.equals(value)) 
     break; 
     else 
     element = null; 
    } 

    if (element != null) { 
    document.getDocumentElement().removeChild(element); 
    document.getDocumentElement().insertBefore(element, nodeList.item(0)); 
    } 

    Source source = new DOMSource(document); 
    Result result = new StreamResult(mFile.getPath()); 

    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.setOutputProperty(OutputKeys.INDENT, "yes"); 
    transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); 
    transformer.transform(source, result); 
} 

が、結果が正しくない:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<Values>  
    <Elem Value="2"/> 
    <Elem Value="1"/>  

    <Elem Value="3"/> 
</Values> 

なぜが空白行になるのですか?

答えて

0

元のXMLファイルには、空白を含むテキストノードが含まれています。あなたのコードはElemノードだけを削除し、それをリストの先頭に挿入しますが、改行を含むテキストノードはそのまま残ります。

0

空のノードまたはパーザで利用可能な空白を持つテキストノードを削除する直接のプロパティはありません。パーサーは、これらのノードの有無に関わらずXMLを解析できます。しかし、それでもやってみたいのであれば、XML仕様ではxml:space = "preserve"という属性がありますが、Javaの例では機能しませんでした。これらのノードを削除する際に典型的な複雑な方法があります。

Remove nodes and empty lines

Stackoverflow Example

関連する問題