我有以下方法来解析XMLElements:
DisplayMessages(XElement root)
{
var items = root.Descendants("Item");
foreach (var item in items)
{
var name = item.Element("Name");
....
}
}
在调试模式下,我可以将root视为XML:
<ItemInfoList>
<ItemInfo>
<Item>
<a:Name>item 1</a:Name>
...
<Item>
...
和var name为null(我希望得到“item 1”)。我试图使用“a:Name”但它引起异常(“字符:不能在名称中使用”)。我不确定是否必须在root XElelement中设置名称空间。 root下的所有xml节点都应位于同一名称空间中。
我是XElement的新手。在我的代码中,item.Element(“Name”)将获取其子节点“Name”的值值,是吗?
答案 0 :(得分:4)
您需要使用包含命名空间的元素名称。试试这个:
static void DisplayMessages(XElement root)
{
var items = root.Descendants(root.GetDefaultNamespace() + "Item");
foreach (var item in items)
{
var name = item.Element(item.GetNamespaceOfPrefix("a") + "Name");
Console.WriteLine(name.Value);
}
}
请注意, operator + 会为XNamespace类重载,以缩短代码:XNamespace.Addition Operator。
答案 1 :(得分:3)
您需要在根元素中定义“a”命名空间:
<Root a:xmlns="http:///someuri.com">
...
</Root>
然后,您可以在LINQ to XML中使用以下语法在非默认命名空间中选择一个元素:
XNamespace a = "http:///someuri.com"; // must match declaration in document
...
var name = item.Element(a + "Name");
修改强>
要检索默认命名空间:
XNamespace defaultNamespace = document.Root.GetDefaultNamespace();
// XNamespace.None is returned when default namespace is not explicitly declared
要查找其他名称空间声明:
var declarations = root.Attributes().Where(a => a.IsNamespaceDeclaration);
请注意,名称空间可以在任何元素上声明,因此您需要递归搜索文档中的所有元素以查找所有名称空间声明。实际上,虽然这通常在根元素中完成,但如果您可以控制XML的生成方式,那么这不会成为问题。
答案 2 :(得分:0)
您需要创建具有非null命名空间的XName。为此,您必须创建一个XNamespace,并添加元素名称,请参阅Creating an XName in a Namespace。
答案 3 :(得分:0)