在以下程序中,helloElem
不是预期的空值。
string xml = @"<root>
<hello></hello>
</root>";
XDocument xmlDoc = XDocument.Parse(xml);
var helloElem = xmlDoc.Root.Element("hello"); //not null
如果给XML一个命名空间:
string xml = @"<root xmlns=""namespace"">
<hello></hello>
</root>";
XDocument xmlDoc = XDocument.Parse(xml);
var helloElem = xmlDoc.Root.Element("hello"); //null
为什么helloElem
变为空?在这种情况下如何获得hello元素?
答案 0 :(得分:3)
当然你可以摆脱namespaces
,见下文:
string xml = @"<root>
<hello></hello>
</root>";
XDocument xmlDoc = XDocument.Parse(xml);
var helloElem = xmlDoc.Descendants().Where(c => c.Name.LocalName.ToString() == "hello");
上面的代码可以处理带有或不带namespaces
的节点。有关详细信息,请参阅 Descendants() 。希望这会有所帮助。
答案 1 :(得分:2)
尝试
XNamespace ns = "namespace";
var helloElem = xmlDoc.Root.Element(ns + "hello");
答案 2 :(得分:2)
执行以下操作
XDocument xmlDoc = XDocument.Parse(xml);
XNamespace ns = xmlDoc.Root.GetDefaultNamespace();
var helloElem = xmlDoc.Root.Element(ns+ "hello");
答案 3 :(得分:1)
这是默认的命名空间XPath。
private static XElement XPathSelectElementDefaultNamespace(XDocument document,
string element)
{
XElement result;
string xpath;
var ns = document.Root.GetDefaultNamespace().ToString();
if(string.IsNullOrWhiteSpace(ns))
{
xpath = string.Format("//{0}", element);
result = document.XPathSelectElement(xpath);
}
else
{
var nsManager = new XmlNamespaceManager(new NameTable());
nsManager.AddNamespace(ns, ns);
xpath = string.Format("//{0}:{1}", ns, element);
result = document.XPathSelectElement(xpath, nsManager);
}
return result;
}
用法:
string xml1 = @"<root>
<hello></hello>
</root>";
string xml2 = @"<root xmlns=""namespace"">
<hello></hello>
</root>";
var d = XDocument.Parse(xml1);
Console.WriteLine(XPathSelectElementDefaultNamespace(d, "hello"));
// Prints: <hello></hello>
d = XDocument.Parse(xml2);
Console.WriteLine(XPathSelectElementDefaultNamespace(d, "hello"));
// Prints: <hello xmlns="namespace"></hello>