English 中文(简体)
使用 Linq 将 XML 字符串转换成对象列表
原标题:Turning XML string into List of Objects using Linq

我试图用Linq(我恨Linq...主要因为我时间不多去了解它是如何运作的,因此,我总是在事情出错时迷惑不解。我希望有一个很好的简单方法来使用XSD或某样东西,以及某种消毒剂和再iririzer...但似乎在.net中没有任何本地的支持。所以我想,为什么不只是使用Linq?大错误。但无论如何,我想改变这个字符串...

<?xml version="1.0" encoding="utf-16"?>
  <ArrayOfPopulation xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Population>
  <id>3</id>
  <name>CHF</name>
  <description>FR Congestive Heart Failure</description>
  <createdDate>2011-10-25T04:00:00Z</createdDate>
  <createdUserID>WPS_ANEMIA_POP_OWNER</createdUserID>
  <modifiedDate>2011-10-31T04:00:00Z</modifiedDate>
  <modifiedUserID>WPS_ANEMIA_POP_OWNER</modifiedUserID>
  <isActive>true</isActive>
  <owner>
    <type>AD GROUP</type>
  </owner>   
  <owner>
    <type>ACCOUNT</type>
  </owner>
  <type>
    <name>ACO SURVEY</name>
  </type>
  </Population>
  <Population>
  <id>2</id>
  <name>COPD</name>
  <description>FR Chronic Obstructive Pulmonary Disease</description>
  <createdDate>2011-10-25T04:00:00Z</createdDate>
  <createdUserID>WPS_ANEMIA_POP_OWNER</createdUserID>
  <modifiedDate>2011-10-31T04:00:00Z</modifiedDate>
  <modifiedUserID>WPS_ANEMIA_POP_OWNER</modifiedUserID>
  <isActive>true</isActive>
  <owner>
    <domain>1UPMC-ACCT</domain>
    <name>InteropDev</name>
    <type>AD GROUP</type>
  </owner>
  <owner>
    <domain>1UPMC-ACCT</domain>
    <name>ACOPopulationUsers</name>
    <type>AD GROUP</type>
  </owner>
  <owner>
    <domain>1UPMC-ACCT</domain>
    <name>muesml</name>
    <type>ACCOUNT</type>
  </owner>
  <owner>
    <domain>1UPMC-ACCT</domain>
    <name>andersonjm</name>
    <type>ACCOUNT</type>
  </owner>
  <type>
    <name>ACO SURVEY</name>
  </type>
 </Population>
 </ArrayOfPopulation>

进入这些对象的阵列...

public class PopulationModel
{
    public string populationID { set; get; }

    public string PopName { set; get; }

    public string Description { set; get; }

    public int PopulationType { set; get; }

    public int isActive { set; get; }

    //public List<XSLTACOData> patients { set; get; }
}

这看起来有点像...

public class PopulationsModel
{
    public List<PopulationModel> Populations { set; get; }
}

我无法用这个 Linq 到 XML 查询...

XDocument xDocument = XDocument.Parse(xmlFromSvc);
XElement elem = xDocument.Element("ArrayOfPopulation");
//client.GetOwnedPopulations();
IEnumerable<PopulationsModel> popModel = (IEnumerable<PopulationsModel>)
     (from templates in elem.Elements("Population")
      select new PopulationModel
      {
          populationID = templates.Attribute("id").Value,
          PopName = templates.Attribute("name").Value,
          Description = templates.Attribute("description").Value,
          PopulationType = int.Parse(templates.Attribute("").Value),
          isActive = int.Parse(templates.Attribute("isActive").Value)
      }).ToList();

我被正式搞糊涂了。为什么地球上没有做这个工作?此外,必须有一个比较容易的方法来完成这个任务?这似乎对xsds和所有其他的废话来说是完美的。我也许在这里努力工作?

现在得到这个例外...

Unable to cast object of type   System.Collections.Generic.List`1[FocusedReadMissionsRedux.Models.PopulationModel]  to type  System.Collections.Generic.IEnumerable`1[FocusedReadMissionsRedux.Models.PopulationsModel] .

这似乎是一种略为合理合理的例外。

最佳回答

为什么这不起作用呢?

让我们看看您正在做什么。 您已经得到了 < code> templates 作为 < code_ lt; pogration> 元素, 然后像这样重新查询 :

  populationID = templates.Attribute("id").Value,
  PopName = templates.Attribute("name").Value,
  Description = templates.Attribute("description").Value,
  PopulationType = int.Parse(templates.Attribute("").Value),
  isActive = int.Parse(templates.Attribute("isActive").Value)

注意您如何在此使用 Attriendte 来进行所有操作。 现在看看 XML :

<Population>
  <id>3</id>
  <name>CHF</name>
  ...
</Population>

Podal 元素没有 任何属性。 它嵌入了 elements 。 我还没有详细检查过, 但更改了您所有 Attragitte 调用到 Eplement /code> 调用, 完全可以固定一切, 除了 FDIType 。 (它并不清楚 < em> 你试图从何处获取这些调用 。 )

请注意,从 XAtrimitte XEplement 作出的明确转换一般比 int.arse 等更干净。

问题回答

Attritute 方法是实际元素时,您正试图使用该方法获得值 。

试试这个(我测试过,

XDocument xDocument = XDocument.Parse(xmlFromSvc);
XElement elem = xDocument.Element("ArrayOfPopulation");

var popModel = (from templates in elem.Elements("Population")
                select new PopulationModel
                {
                     populationID = (string)templates.Element("id"),
                     PopName = (string)templates.Element("name"),
                     Description = (string)templates.Element("description"),
                     PopulationType = (int)templates.Element("Type").Element("Name"),
                     isActive = (int)templates.Element("isActive")
                }).ToList();




相关问题
Updating Linq to XML element values concatenation issues

I am trying to write a app.config / web.config error correcting app which will audit our developers applications for incorrect environment settings. I am using Linq to XML to accomplish this and I am ...

Is LINQ to XML s XElement ordered?

When I use LINQ to XML, is the order of the elements and attributes written out to text guaranteed to be the same order as how I added the XElement and XAttribute objects? Similarly, when I read in ...

热门标签