2012-12-06 2 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" 만듭니다.

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

어떻게 이런 짓을 했을까

: 나는 위의 모든 캡슐화하는 <AnalysisSets> 그래서이 될 것입니다 있도록 설정하려면

내 질문은,? 루트 요소와 2 개의 서브 루트 요소를 만들려고하는 것 같습니다. 나는 그 일을 성취하는 방법에 대해 확신 할 수 없다.

답변

2

바로 직렬화를 사용 해본 적이 있습니까? 어쨌든 여기 내 완벽한 모형이 있습니다.

편집 : 나는에 모든 일을 추가 한 후 손 전에 일부`XElement` 항목을 만들고 규칙 XML을 입력하기 전에 그들을 함께 추가하고 한 일을 결국 무엇

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

:-) 결과 노드를 잊어 버렸습니다 'XDocument' – wjhguitarman