2009-06-02 31 views
1

最近、Save a list with nested elements to XMLの方法に関する質問がありましたが、クラスのローダーを作成しようとしていて、問題が発生しました。LiNQを使用してネストされたXMLをロードする

私は与えられた答えを逆にしようとしています(thanks Jon)。

私のコアLINQクエリは大丈夫です、私は苦労している再帰です。適した付加された

XDocument doc = XDocument.Parse(xml); 

    Func<XElement, ErrorType> nodeReader = null; 
    nodeReader = el => new ErrorType(
     el.Elements().Select(nodeReader)) { 
     Name = el.Name.LocalName, 
     Ignore = (bool)el.Attribute("Ignore"), 
    }; 

    ErrorList list = new ErrorList(
     doc.Root.Elements().Select(nodeReader)); 

: は、ここで私はそれが何かの作業だ

/// <summary> 
/// 
/// </summary> 
public class ErrorType 
{ 
    List<ErrorType> _childErrors; 

    public String Name { get; set; } 
    public bool Ignore { get; set; } 

    public List<ErrorType> ChildErrors { get; protected set; } 
} 

/// <summary> 
/// 
/// </summary> 
public class ErrorList 
{ 
    public List<ErrorType> ChildErrors { get; protected set; } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="xml"></param> 
    public void FilterErrors(XElement xml) 
    { 
     //Convert to ErrorList 
     //Write back out to XML but not writing out anything with errors 
     //Send XML on its way 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="el"></param> 
    /// <returns></returns> 
    private XElement ErrorListToXml(ErrorList el) 
    { 
     // Need to declare in advance to call within the lambda. 
     Func<ErrorType, XElement> recursiveGenerator = null; 
     recursiveGenerator = error => new XElement 
      (error.Name, 
      new XAttribute("Ignore", error.Ignore), 
      error.ChildErrors.Select(recursiveGenerator)); 

     var element = new XElement 
        ("ErrorList", 
        ChildErrors.Select(recursiveGenerator)); 

     Console.WriteLine(element); 

     return element; 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="xd"></param> 
    /// <returns></returns> 
    private ErrorList FromXmlToErrorList(XElement xd) 
    { 
     //Prepare lambda 
     Func<ErrorType, XElement> recursiveGenerator = null; 
     recursiveGenerator = error => new List<ErrorType> 
      (error.Name, 
      new XAttribute("Ignore", error.Ignore), 
      error.ChildErrors.Select(recursiveGenerator)); 

     List<ErrorType> typeList = (from error in xd.Descendants() 
         select new ErrorType 
         { 
          Name = error.Value, 
          Ignore = bool.Parse(error.Attribute("Ignore").Value), 
          ChildErrors= error.Elements().Select() 
         }).ToList<ErrorType>(); 

     ErrorList el = new ErrorList(); 
     el.ChildErrors = typeList; 
     return el; 
    } 

    /// <summary> 
    /// 
    /// </summary> 
    public void Save() 
    { 
     XElement xml = ErrorListToXml(this); 
     xml.Save("errorlist.xml"); 
    } 

    public void Load() 
    { 

    } 
} 

ありがとう

答えて

3

を(あるとして、私は全体のCPPを掲載している明確さのために)これまでの私のコードですコンストラクタ:

public ErrorType(IEnumerable<ErrorType> children) { 
    ChildErrors = new List<ErrorType>(children); 
} 
public ErrorType() { ChildErrors = new List<ErrorType>(); } 

public ErrorType(IEnumerable<ErrorType> children) { 
    ChildErrors = new List<ErrorType>(children); 
} 
public ErrorType() { ChildErrors = new List<ErrorType>(); } 

どのような用途ですか?

+0

これは非常にうまくありがとう働きました。明示的に子を設定していないので、どのように動作するのか全く分かりません。 – Chris

+0

コンストラクタ自身が子を作成します - xml上のイテレータ(背後にある)である "children"パラメータを反復することによって... –

+0

ああ、私はコードが失明していて、あなたが関数内のctorにリストを渡すのを見ませんでした。ニースの仕事のおかげです。 – Chris

1

わかりましたが、私はこれを試したことのない(と、今までの時間を持っていない)が、私はそれはかなり多くの仕事をすべきだと思う...

public class ErrorType 
{ 
    List<ErrorType> _childErrors; 

    public String Name { get; set; } 
    public bool Ignore { get; set; } 

    public List<ErrorType> ChildErrors { get; protected set; } 

    public static ErrorType Parse(XElement element) 
    { 
     return new ErrorType 
     { 
      Name = element.Name.LocalName, 
      Ignore = (bool) element.Attribute("Ignore"), 
      ChildErrors = element.Elements() 
           .Select(x => Parse(x)) 
           .ToList() 
     }; 
    } 
} 

public class ErrorList 
{ 
    public List<ErrorType> ChildErrors { get; protected set; } 

    public static ErrorList Parse(XElement element) 
    { 
     return new ErrorList { ChildErrors = element.Elements() 
           .Select(x => ErrorType.Parse(x)) 
           .ToList() }; 
    } 
} 
+0

返事をありがとうジョンは、私はそれを働かせることができませんでした。おそらく、あなたのやり遂げたことと、あなたがやろうとしたことをつなぎ合わせることができなかったことの組み合わせです。 – Chris

+0

固定 - 今は大丈夫です。 –

関連する問題