1

次のプログラムでhelloElemは、予想どおり、null ではありません。

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 要素を取得するにはどうすればよいですか?

4

4 に答える 4

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()を参照してください。お役に立てれば。

于 2013-07-29T15:07:45.593 に答える
2

以下のようにする

XDocument xmlDoc = XDocument.Parse(xml);
XNamespace  ns = xmlDoc.Root.GetDefaultNamespace();
var helloElem = xmlDoc.Root.Element(ns+ "hello"); 
于 2013-07-29T14:39:45.583 に答える
2

試す

 XNamespace ns = "namespace";
 var helloElem = xmlDoc.Root.Element(ns + "hello"); 
于 2013-07-29T14:29:49.630 に答える
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>
于 2013-07-29T14:55:22.323 に答える