我有一个像这样的xml
<?xml version="1.0"?>
<DataSetExchangeWMS xmlns="http://tempuri.org/DataSetExchangeWMS.xsd">
<dtObjektInfo>
<LanguageCode>1031</LanguageCode>
<LiegenschaftID>7463</LiegenschaftID>
</dtObjektInfo>
1040 7463 09
现在,当我从教程中学习时,我获取了我的xml文件并从后代中选择节点。
现在为什么第一个外行不起作用?我需要创建复杂的查询。
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 />");
}
答案 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),这将有助于编码。所有元素都可以转换为正确的类型(或抛出的异常)。以后节省了很多问题。