给出以下xml:
<root xmlns="http://tempuri.org/myxsd.xsd">
<node name="mynode" value="myvalue" />
</root>
并给出以下代码:
string file = "myfile.xml"; //Contains the xml from above
XDocument document = XDocument.Load(file);
XElement root = document.Element("root");
if (root == null)
{
throw new FormatException("Couldn't find root element 'parameters'.");
}
如果根元素包含xmlns属性,则变量root为null。如果我删除xmlns属性,则root不为null。
任何人都可以解释为什么会这样吗?
答案 0 :(得分:1)
当您声明像<root xmlns="http://tempuri.org/myxsd.xsd">
这样的根元素时,这意味着您的根元素的所有后代都在http://tempuri.org/myxsd.xsd
命名空间中。默认情况下,元素的名称空间具有空名称空间,XDocument.Element
查找没有名称空间的元素。如果要访问具有命名空间的元素,则应明确指定命名空间。
var xdoc = XDocument.Parse(
"<root>" +
"<child0><child01>Value0</child01></child0>" +
"<child1 xmlns=\"http://www.namespace1.com\"><child11>Value1</child11></child1>" +
"<ns2:child2 xmlns:ns2=\"http://www.namespace2.com\"><child21>Value2</child21></ns2:child2>" +
"</root>");
var ns1 = XNamespace.Get("http://www.namespace1.com");
var ns2 = XNamespace.Get("http://www.namespace2.com");
Console.WriteLine(xdoc.Element("root")
.Element("child0")
.Element("child01").Value); // Value0
Console.WriteLine(xdoc.Element("root")
.Element(ns1 + "child1")
.Element(ns1 + "child11").Value); // Value1
Console.WriteLine(xdoc.Element("root")
.Element(ns2 + "child2")
.Element("child21").Value); // Value2
对于你的情况
var ns = XNamespace.Get("http://tempuri.org/myxsd.xsd");
xdoc.Element(ns + "root").Element(ns + "node").Attribute("name")