【问题标题】:Dynamically building xml tree's during runtime using linq使用 linq 在运行时动态构建 xml 树
【发布时间】:2010-11-08 17:29:27
【问题描述】:

这是一个设计问题,可以激发大师的胃口。

在以前的版本中,代码使用路径定义,即 /../../ 来提供有关如何构建艺术 xml 文档的说明。根据 xml 模式,文档必须是正确的,因此路径本质上是 xpath,被读取并在 switch 语句中用于调用代码来构造文档。但不要挂断它。

例如读入编码时的调用

jim.set("/Alert/Source/DetectTime", "12:03:2010 12:22:21");

会创造

<Alert> 
  <Source>
    <DetectTime>12:03:2010 12:22:21</DetectTime>
  </Source>
</Alert>

jim.set 只是将树存储在特定的上下文中。

现在我想使用 linq to xsd 来创建 xml 树,但我仍在寻找一些能够让用户定义如何构造树的结构。 XPath 很简单,但实现起来有点笨重,不优雅,而且我不容易映射。

任何想法、任何程序、开源、研究,任何东西都会得到赞赏。如果我没有得到答案,我将在 3 天内提供体面的赏金。 鲍勃。

【问题讨论】:

    标签: xml linq c#-4.0 linq-to-xml


    【解决方案1】:

    做这样的事情怎么样:

    public XDocument CreateXDocument(string path, string value)
    {
        var parts = path.Split(new [] { '/', },
            StringSplitOptions.RemoveEmptyEntries);
        return new XDocument(this.CreateXElement(parts, value));
    }
    
    private XElement CreateXElement(IEnumerable<string> parts, string value)
    {
        var content = parts.Count() == 1 ?
            (object)value :
            (object)this.CreateXElement(parts.Skip(1), value);
        return new XElement(parts.First(), content);
    }
    

    然后您可以像这样运行代码:

    var xd = this.CreateXDocument("/Alert/Source/DetectTime", "12:03:2010 12:22:21");
    Console.WriteLine(xd.ToString());
    

    这将产生:

    <Alert>
      <Source>
        <DetectTime>12:03:2010 12:22:21</DetectTime>
      </Source>
    </Alert>
    

    我想我可能会发布一个更易读的CreateXElement 方法的变体。功能是相同的,甚至可能会有微小的性能提升。

    private XElement CreateXElement(IEnumerable<string> parts, string value)
    {
        var head = parts.First();
        var tail = parts.Skip(1);
        var content = tail.Any() ?
            (object)this.CreateXElement(tail, value) :
            (object)value;
        return new XElement(head, content);
    }
    

    【讨论】:

    • 谜团,感谢您的快速回复。在创建 Source 元素后,您将如何添加一个属性“id”来表示它?
    • 大多数。合适的。用户名。永远。
    • @scope_creep - 您可以在之后添加它:xd.Descendants("Source").First().Add(new XAttribute("id", 42));。你也可以通过扩展我的方法来添加它,并用其他分隔符分割每个部分(即headparts.First()),比如“|”。
    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多