我有一个奇怪的问题,我尝试了有关XDocument的一切。
我想获取“CategoryClass”节点的值,并在我自己的“ListBoxClass”类型的对象中填充子节点。但是LINQ查询没有返回任何内容。
System.Xml.Linq.XNamespace lName = xDoc.Root.GetDefaultNamespace();
System.Xml.Linq.XNamespace lANamespace = "http://schemas.datacontract.org/2004/07/KRefreshService";
var lEle = from xml2 in xDoc.Element(lName + "GetCategoriesResponse").Element(lName + "GetCategoriesResult").Elements(lANamespace + "CategoryClass")
select new ListBoxClass
{
Id = (int)xml2.Element(lName + "ID"),
Name = xml2.Element(lName+ "CatName").ToString(),
Description = xml2.Element(lName + "CatDescription").ToString()
};
这是XML
<GetCategoriesResponse xmlns="http://tempuri.org/">
<GetCategoriesResult xmlns:a="http://schemas.datacontract.org/2004/07/KRefreshService" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:CategoryClass>
<a:CatDescription>General questions regarding IQ. These questions will help you prepare for the interviews.</a:CatDescription>
<a:CatName>IQ</a:CatName>
<a:ID>1</a:ID>
</a:CategoryClass>
<a:CategoryClass>
<a:CatDescription>This category will help you improve your general knowledge. It have information from all the different subjects.</a:CatDescription>
<a:CatName>General Knowledge</a:CatName>
<a:ID>2</a:ID>
</a:CategoryClass>
<a:CategoryClass>
<a:CatDescription>If you feel that you computer science basics are slipping by your head as you involve more in technology. No problem! subscribe to this category.</a:CatDescription>
<a:CatName>Computer Science</a:CatName>
<a:ID>3</a:ID>
</a:CategoryClass>
答案 0 :(得分:1)
问题是查询的这一部分:
select new ListBoxClass
{
Id = (int)xml2.Element(lName + "ID"),
Name = xml2.Element(lName+ "CatName").ToString(),
Description = xml2.Element(lName + "CatDescription").ToString()
};
您在这里使用了错误的命名空间 - 这些元素具有a
前缀:
<a:CatDescription>...</a:CatDescription>
<a:CatName>IQ</a:CatName>
<a:ID>1</a:ID>
...所以他们正在使用命名空间http://schemas.datacontract.org/2004/07/KRefreshService"
。您正在使用在文档的根元素中声明的命名空间。
此外,我希望您想要每个XElement
的值,我倾向于通过显式转换为string
来获取该值。调用ToString()
将为您提供元素的缩进XML。所以你想要:
select new ListBoxClass
{
Id = (int) xml2.Element(lANamespace + "ID"),
Name = (string) xml2.Element(lANamespace + "CatName"),
Description = (string) xml2.Element(lANamespace + "CatDescription")
};
(不清楚为什么你完全合格System.Xml.Linq.XNamespace
,或者为什么你的变量有l
前缀...你可以做很多事情来做这件事代码更清晰,当你使它工作。)
编辑:你说的代码不起作用对我来说很好:
using System;
using System.Linq;
using System.Xml.Linq;
public class Test
{
static void Main(string[] args)
{
XDocument doc = XDocument.Load("test.xml");
XNamespace envelopeNs = doc.Root.GetDefaultNamespace();
XNamespace resultNs = "http://schemas.datacontract.org/2004/07/KRefreshService";
Console.WriteLine(doc.Element(envelopeNs + "GetCategoriesResponse")
.Element(envelopeNs + "GetCategoriesResult")
.Elements(resultNs + "CategoryClass")
.Count());
}
}
打印3.所以如果你遇到问题,必须有一些你没有告诉过我们的东西。