【问题标题】:XDocument to List of objectXDocument 到对象列表
【发布时间】:2013-02-26 21:02:49
【问题描述】:

XDocument 的内容是下面的 XML。

我想获得一个 List(),请参阅此消息的末尾。

<myXml>
  <myDatas code="01">
    <myVar name="myvar" value="A" />
    <myData name="A" value="A1" />
    <myData name="B" value="B1" />
  </myDatas>
  <myDatas code="02">
    <myVar name="myvar" value="B" />
    <myData name="A" value="A2" />
    <myData name="D" value="D2" />
  </myDatas>
</myXml>

public class MyData
{
    public string MainCode { get; set; }
    public string Code { get; set; }
    public string Value { get; set; }
}

我想要一个 List() 这个内容应该是这样的:

new MyData { MainCode = "01"; Code = "A"; Value = "A1" };
new MyData { MainCode = "01"; Code = "B"; Value = "B1" };
new MyData { MainCode = "02"; Code = "A"; Value = "A2" };
new MyData { MainCode = "02"; Code = "D"; Value = "D2" };

【问题讨论】:

  • 我的回答最后对你没有用吗? (我看到你没有接受它。)请添加说明问题的评论。
  • -1 用于编辑问题。您提出了一个问题,您已收到该问题的正确答案。
  • @lazyberezovsky 你是对的,我删除了更新

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


【解决方案1】:

当然 - 所以你需要这样的东西:

var query = from datas in doc.Root.Elements("myDatas")
            let code = (string) datas.Attribute("code")
            from data in datas.Elements("myData")
            select new MyData {
                MainCode = code,
                Code = (string) data.Attribute("name"),
                Value = (string) data.Attribute("value"),
            };

var list = query.ToList();

注意多个from 子句以展平结果。

另一种选择是找到所有“叶”元素并从父元素获取代码部分:

var query = from data in doc.Descendants("myData")
            select new MyData {
                MainCode = (string) data.Parent.Attribute("code"),
                Code = (string) data.Attribute("name"),
                Value = (string) data.Attribute("value"),
            };

var list = query.ToList();

编辑:如果您的文档使用命名空间,那也很容易:

XNamespace ns = "http://the-uri-of-the-namespace";
var query = from data in doc.Descendants(ns + "myData")
            ...

这使用了XName operator +(XNamespace, string) 重载运算符。

【讨论】:

  • 你能检查我的更新乔恩。有了示例,第一个 XML 代码,没关系,但不是更新中的那个(当然我调整了 name 属性)
  • @Kris-I:那么您的文档实际上是否有myXml 根标签?价值部分发生了什么?您说第二个 XML “不行” - 会发生什么? (您给出了两个完全不同的文档,具有两组不同的预期结果。我的原始答案不适用于第二个文档,我并不感到惊讶......)
  • 您的代码有效,但在 2 种情况下出现异常:1. 当 myxml 节点具有命名空间时 2. 当属性值具有“é”(数据为法语)时异常:无效字符在给定的编码中
  • @Kris-I:命名空间在 LINQ to XML 中很容易——我将在我的答案中添加一个示例。对于编码部分,听起来您的 XML 数据无效……您需要确保文档中使用的编码与声明匹配,如果未明确说明,则 UTF-8 是默认值。 (我推荐 UTF-8。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多