我在使用Linq to XML解析以下XML时遇到问题。我正在做的是让元素检查它是否是我想要的,然后移动到下一个。我很确定它与xmlns有关,但是我需要这个代码来处理这种样式和普通样式的RSS提要(没有xmlns)。有什么想法吗?
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
<channel rdf:about="http://someurl.com">
<title>sometitle</title>
XElement currentLocation = startElementParameter;
foreach (string x in ("channel\\Title").Split('\\'))
{
if (condition1 == false)
{
continue;
}
else if (condition2 == false)
{
break;
}
else
{
// This is returning null.
currentLocation = currentLocation.Element(x);
}
}
谢谢!
编辑:XML没有正确粘贴。
答案 0 :(得分:0)
XElement.Element方法需要XName。
您正在传递一个字符串,这意味着它被隐式转换为没有附加名称空间的XName。
换句话说,您的XElement.Element()
调用要求名为channel
的元素没有命名空间,但示例XML中的channel
元素位于http://purl.org/rss/1.0/
命名空间中到xmlns="http://purl.org/rss/1.0/"
上的<rdf:RDF>
属性。
要在命名空间存在时正确提取通道元素,您可以执行以下操作:
var ns = XNamespace.Get("http://purl.org/rss/1.0/");
currentLocation = currentLocation.Element(ns + "channel");
在XNamespace和字符串上使用+运算符可创建带有附加名称空间的XName。
要支持此文档的两种样式,请检查XDocument.Root
是否具有具有预期URI值的命名空间。您可以使用XElement.GetDefaultNamespace()。