2012-02-10 5 views
-2

文書内の属性 "nil = true"を持つXML要素を消去しようとしています。 私はこの孤独を考え出すが、それはどのように見えるのが好きではない。属性 "nil = true"でXML要素をクリーンアップします - linqバージョンを作成しますか?

誰でもこのalgoのバージョンを知っていますか?

/// <summary> 
    /// Cleans the Xml element with the attribut "nil=true". 
    /// </summary> 
    /// <param name="value">The value.</param> 
    public static void CleanNil(this XElement value) 
    { 
     List<XElement> toDelete = new List<XElement>(); 

     foreach (var element in value.DescendantsAndSelf()) 
     { 
      if (element != null) 
      { 
       bool blnDeleteIt = false; 
       foreach (var attribut in element.Attributes()) 
       { 
        if (attribut.Name.LocalName == "nil" && attribut.Value == "true") 
        { 
         blnDeleteIt = true; 
        } 
       } 
       if (blnDeleteIt) 
       { 
        toDelete.Add(element); 
       } 
      } 
     } 

     while (toDelete.Count > 0) 
     { 
      toDelete[0].Remove(); 
      toDelete.RemoveAt(0); 
     } 
    } 
+3

を使用XML名前空間については何も言及していませんが、http://www.w3.org/2001/XMLSchema-instance名前空間(しばしば接頭辞 'xsi'を使用します)は' nil'属性を持っています。これはnil要素に対して 'true' 。それが使用している属性の場合は、回答が期待どおりに機能しない理由が説明されています。答えは、デフォルトの名前空間で 'nil'属性を探し、あなたのXMLでは動作しません。 –

答えて

1

nil属性の名前空間は何ですか?このようにその内部を{}置く:

public static void CleanNil(this XElement value) 
{ 
    value.Descendants().Where(x=> (bool?)x.Attribute("{http://www.w3.org/2001/XMLSchema-instance}nil") == true).Remove(); 
} 
0

これは動作するはずです。..

public static void CleanNil(this XElement value) 
{ 
    var todelete = value.DescendantsAndSelf().Where(x => (bool?) x.Attribute("nil") == true); 
    if(todelete.Any()) 
    { 
     todelete.Remove(); 
    } 
} 
+0

申し訳ありませんが動作しません! – frankyt79

+0

どのようなエラーが表示されますか? – Flowerking

0

拡張メソッド:

public static class Extensions 
{ 
    public static void CleanNil(this XElement value) 
    { 
     value.DescendantsAndSelf().Where(x => x.Attribute("nil") != null && x.Attribute("nil").Value == "true").Remove(); 
    } 
} 

使用例:

File.WriteAllText("test.xml", @" 
       <Root nil=""false""> 
        <a nil=""true""></a> 
        <b>2</b> 
        <c nil=""false""> 
         <d nil=""true""></d> 
         <e nil=""false"">4</e> 
        </c> 
       </Root>"); 
var root = XElement.Load("test.xml"); 
root.CleanNil(); 
Console.WriteLine(root); 

出力:

<Root nil="false"> 
    <b>2</b> 
    <c nil="false"> 
    <e nil="false">4</e> 
    </c> 
</Root> 

ご覧のとおり、ノード<a><d>が期待どおりに削除されています。注意すべき唯一のことは、ルート・ノードを削除することはできませんので、あなたが<Root>ノードでこのメソッドを呼び出すことはできませんということです、そしてあなたは、この実行時エラーが発生します。

The parent is missing.

+0

申し訳ありませんも機能しません! – frankyt79

+0

@ frankyt79それはうまくいかないという意味ですか?私は答えに実際の例を加えました。私はそれをテストし、それは動作します。 – Meysam

0

私はその問題を解決し、私のNULL可能タイプ にnilを作成するために回避するための私の方法を変え、私はあなたが質問し、次の

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer%28v=vs.90%29.aspx

public class OptionalOrder 
    { 
     // This field should not be serialized 
     // if it is uninitialized. 
     public string FirstOrder; 

     // Use the XmlIgnoreAttribute to ignore the 
     // special field named "FirstOrderSpecified". 
     [System.Xml.Serialization.XmlIgnoreAttribute] 
     public bool FirstOrderSpecified; 
    } 
関連する問題