2012-12-06 38 views
0

我創建了一個XDocument,該構造使用一組數據填充。現在構造XDocument以正確格式標記

<Results> 
     <RuleResult> 
     <Title> RuleTitle </Title> 
     </RuleResult> 
     <RuleResult> 
     <Title> Rule2Title </Title> 
     </RuleResult> 
    </Results> 

我怎麼有這個配方在C#如下::

輸出看起來像這樣

XDocument doc = new XDocument(new XElement("Results")); 
    foreach (AnalysisSet rules in allAnalysisSets) 
    { 
     foreach (var rule in rules.Rules) 
     { 
      doc.Root.Add(new XElement(rule.GetRuleState())); 
     } 
    } 

據我瞭解,這造成"Results"爲根級別節點。

我的問題是,如果我想將它設置,使封裝了所有的上面是<AnalysisSets>所以這將是:

<AnalaysisSets> 
     <AnalysisSet ProviderName="ProductNameHere"> 
     <Results> 
      <....xml data..../> 
     </Results> 
     </AnalysisSet> 
    </AnalysisSets> 

我將如何做到這一點?這似乎是我會試圖創建一個根元素,然後2個子根元素?如果這確實是一條正確的道路,我不太清楚如何實現這一目標。

回答

2

你有沒有考慮過直接使用序列化?無論如何,這裏是我完整的模型。

編輯:我忘了結果節點:-)

public class Program 
{ 
    private static void Main(string[] args) 
    { 
     var allAnalysisSets = new AnalysisSet[] { 
      new AnalysisSet(){ 
       ProviderName = "productname1", 
       Rules = new Rule[]{ 
       new Rule(){ Title="rule1" } 
      } }, 
      new AnalysisSet(){ 
       ProviderName = "productname2", 
       Rules = new Rule[]{ 
       new Rule(){ Title="rule1" }, 
       new Rule(){ Title="rule2" } 
      } } 
     }; 

     var sb = new StringBuilder(); 
     using (var sw = new StringWriter(sb)) 
     using (var xw = XmlWriter.Create(sw, new XmlWriterSettings() { Indent = true })) 
     { 
      new XElement("AnalaysisSets" 
       , allAnalysisSets 
        .Select(set => new XElement("AnalysisSet" 
          , new XAttribute("ProviderName", set.ProviderName) 
          , new XElement("Results" 
           , set.Rules.Select(rule => rule.GetRuleState()) 
          ) 
         ) 
        ) 
      ).WriteTo(xw); 
     } 
     Console.Write(sb.ToString()); 
     Console.ReadLine(); 
    } 
} 

public class AnalysisSet 
{ 
    public IEnumerable<Rule> Rules { get; set; } 

    public string ProviderName { get; set; } 
} 

public class Rule 
{ 
    public string Title { get; set; } 

    public XStreamingElement GetRuleState() 
    { 
     return new XStreamingElement("RuleResult", 
      new XElement("Title", Title)); 
    } 
} 
+0

我最終什麼事做的是創造的手之前的一些'XElement'項目和輸入規則XML之前一起加入他們,然後將整個事情'XDocument' – wjhguitarman