代码之家  ›  专栏  ›  技术社区  ›  scope_creep

使用linq在运行时动态构建xml树

  •  0
  • scope_creep  · 技术社区  · 14 年前

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

    在以前的版本中,代码使用路径定义,即/../../。根据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只是将树存储在特定的上下文中。

    任何想法,任何程序,开源,研究,任何东西都会受到重视。如果我得不到答复,我将在三天内提供一笔可观的赏金。 鲍勃。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Enigmativity    14 年前

    不如这样做:

    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);
    }
    
    推荐文章