【问题标题】:Structuring XDocument to properly format Tags构建 XDocument 以正确格式化标签
【发布时间】:2012-12-06 15:46:31
【问题描述】:

我正在创建一个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" 创建为根级节点。

我的问题是,如果我想设置它以便封装以上所有内容是&lt;AnalysisSets&gt;,那么它会是:

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

我该怎么做?似乎我会尝试创建一个 Root 元素,然后创建 2 个子根元素?如果这确实是正确的开始,我不太确定如何去做。

【问题讨论】:

    标签: c# xml xml-serialization xml-formatting


    【解决方案1】:

    您是否考虑过只使用直接序列化?无论如何,这是我的完整模型。

    编辑:我忘记了结果节点:-)

    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));
        }
    }
    

    【讨论】:

    • 我最终做的是事先创建一些 XElement 项目,然后在输入规则 xml 之前将它们添加在一起,然后将整个内容添加到 XDocument
    猜你喜欢
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2012-12-14
    相关资源
    最近更新 更多