linq到xml选择

时间:2009-11-06 09:11:09

标签: linq linq-to-xml

我有一个像这样的xml

<?xml version="1.0"?>
<DataSetExchangeWMS xmlns="http://tempuri.org/DataSetExchangeWMS.xsd">
  <dtObjektInfo>
    <LanguageCode>1031</LanguageCode>
    <LiegenschaftID>7463</LiegenschaftID>
  </dtObjektInfo>

    1040     7463     09        

现在,当我从教程中学习时,我获取了我的x​​ml文件并从后代中选择节点。

现在为什么第一个外行不起作用?我需要创建复杂的查询。

XDocument test = XDocument.Load(Server.MapPath("~/XML/objects.xml"));

var objecte = from i in test.Root.Descendants("dtObjektInfo")
              select i;

// new test with where
        var objecte = from i in test.Descendants( ns + "dtObjektInfo")
                      where i.Element("LanguageCode").Value == "1031"
                      select i;

foreach (var item1 in objecte)
{
    Response.Write(item1.Value);
}

foreach (XElement item in test.Root.Nodes())
{
    Response.Write(item.Value + "<br />");
}

2 个答案:

答案 0 :(得分:1)

您没有使用XML文档中定义的XML命名空间!

在查询XML时需要指定XML命名空间:

XNamespace ns = "http://tempuri.org/DataSetExchangeWMS.xsd";

var objecte = from i in test.Root.Descendants(ns + "dtObjektInfo")
              select i;

马克

答案 1 :(得分:1)

Marc已基本解决了你的问题,但我想我会考虑一些问题。 如果您有复杂的XML,我建议使用已定义的对象。从长远来看,这会让事情变得更容易。

为你的例子

public class dtObjektInfo
    {
        public string LanguageCode { get; set; }
        public string LiegenschaftID { get; set; }
    }

然后您调用它的代码将变为

XDocument root = XDocument.Load("c:\\test.xml");
XNamespace ns = "http://tempuri.org/DataSetExchangeWMS.xsd";


dtObjektInfo objecte = (from i in root.Descendants(ns + "dtObjektInfo")

select new dtObjektInfo
{
       LanguageCode = i.Element(ns+"LanguageCode").Value,
       LiegenschaftID = i.Element(ns+"LiegenschaftID").Value 
}).First();

然后,您可以直接从dtObjektInfo对象访问这些值。使用大型xml文件使编码变得更容易,因为所有工作都在linq查询中完成,然后你有一个最终对象。

这样做的好处是你只需要使用linq一次。您现在正在使用其属性已知的对象(AND INTELLISENSE YAY),这将有助于编码。所有元素都可以转换为正确的类型(或抛出的异常)。以后节省了很多问题。