XML 元素和命名空间
Posted
技术标签:
【中文标题】XML 元素和命名空间【英文标题】:XML Element and Namespace 【发布时间】:2009-09-21 04:23:05 【问题描述】:我有以下方法来解析 XMLElements:
DisplayMessages(XElement root)
var items = root.Descendants("Item");
foreach (var item in items)
var name = item.Element("Name");
....
在调试模式下,我可以像这样看到根为 XML:
<ItemInfoList>
<ItemInfo>
<Item>
<a:Name>item 1</a:Name>
...
<Item>
...
并且 var name 为空(我希望得到“项目 1”)。我尝试使用“a:Name”,但它导致异常(“字符:不能在名称中使用”)。我不确定是否必须在根 XElelement 中设置命名空间。 root 下的所有 xml 节点都应该在同一个命名空间中。
我是 XElement 的新手。在我的代码中,item.Element("Name") 将获取其子节点“Name”的值,对吗?
【问题讨论】:
root
这里是 XML 的实际根节点吗?即,您的 XML sn-p 是您收到的完整 XML 文档吗?如果是,那么它就是无效的 XML。
【参考方案1】:
您需要使用包含命名空间的元素名称。试试这个:
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。
【讨论】:
【参考方案2】:您确实需要在根元素中定义“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 的生成方式,那么这将不是问题。
【讨论】:
【参考方案3】:您需要创建具有非空命名空间的 XName。为此,您必须创建一个 XNamespace,并添加元素名称,请参阅 Creating an XName in a Namespace。
【讨论】:
【参考方案4】:如果您使用包含命名空间的 XML 数据,则需要声明这些命名空间。 (这是我所做的一般性观察,尽管它似乎很难“看一看”你不知道的数据)。
您需要为您的 XElement 声明一个 XNamespace,如以下 MSDN 示例中所示:Element()、XName
【讨论】:
以上是关于XML 元素和命名空间的主要内容,如果未能解决你的问题,请参考以下文章