0

私は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 つのサブルート要素を作成しようとしているように思えますか? それが実際に最初から正しい道である場合、それを達成する方法がよくわかりません。

4

1 に答える 1

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));
    }
}
于 2012-12-06T16:25:53.300 に答える