0

次の 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 属性が含まれている場合、変数ルートは null です。xmlns 属性を削除すると、ルートは null ではありません。

これがなぜなのか説明できる人はいますか?

4

1 に答える 1

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")
于 2013-01-22T22:10:34.310 に答える