【问题标题】:processing Xnode with Linq efficiently使用 Linq 高效处理 Xnode
【发布时间】:2012-06-04 15:27:07
【问题描述】:

我有以下格式的 xml 节点。该节点必须转换为用户定义的类型,即每个节点都必须转换为 MyClass 的对象

class MyClass
{
  public string tag1Id {get;set;}
  public int tag3Val {get;set;}
  public string tag3Id {get;set;}
  public int tag5Val {get;set;}
  public string tag5Id {get;set;}
  public DataTime tag7Val {get;set;}

}

  <tag1 id="id1">
     <tag2>
       <tag3 id="id3">10</tag3>
       <tag4>
        <tag5 id="id5">20</tag5>
       </tag4>
     </tag2>
     <tag6>
      <tag7>2010-12-31</tag7>
     </tag6>
    </tag1>

我是 linq 的新手,可以使用 linq 完成吗?要求是不应使用 xmlseralization :( 有没有其他方法可以轻松处理这种情况?

【问题讨论】:

  • 这个xml有什么意义?名字太可怕了。如果正在使用的 xml 不是来自遗留代码,请对其进行更改以使其有意义,否则如果需要,从现在起将无法调试/维护/理解。

标签: c# .net xml linq linq-to-xml


【解决方案1】:

不,这是不可能的。

由于业务逻辑管道必须在某处进行转换才能从严格的节点 ID/位置转到特定属性。

可以做的是编写一个构造函数,它接收节点并相应地填充属性。然后可以使用 Linq 枚举节点并通过 select 创建类元素的新投影,例如:

     string data = @"
<tags>
  <tag id=""id1""> 
     <tag2> 
       <tag3 id=""id3"">10</tag3> 
       <tag4> 
        <tag5 id=""id5"">20</tag5> 
       </tag4> 
     </tag2> 
     <tag6> 
      <tag7>2010-12-31</tag7> 
     </tag6> 
    </tag> 
</tags>
    ";
var xml = XDocument.Parse(data);

    var classes = xml.Descendants( "tag1" )
                     .Select( nd => new MyClass( nd ) );

【讨论】:

    猜你喜欢
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2023-02-09
    • 2015-02-07
    • 2014-03-16
    • 2017-02-24
    相关资源
    最近更新 更多