59

私はこのコードを持っています:

/*string theXml =
@"<Response xmlns=""http://myvalue.com""><Result xmlns:a=""http://schemas.datacontract.org/2004/07/My.Namespace"" xmlns:i=""http://www.w3.org/2001/XMLSchema-instance""><a:TheBool>true</a:TheBool><a:TheId>1</a:TheId></Result></Response>";*/

string theXml = @"<Response><Result><TheBool>true</TheBool><TheId>1</TheId></Result></Response>";

XDocument xmlElements = XDocument.Parse(theXml);

var elements = from data in xmlElements.Descendants("Result")
               select new {
                            TheBool = (bool)data.Element("TheBool"),
                            TheId = (int)data.Element("TheId"),
                          };

foreach (var element in elements)
{
    Console.WriteLine(element.TheBool);
    Console.WriteLine(element.TheId);
}

theXml の最初の値を使用すると、結果は null になりますが、2 番目の値では適切な値が得られます...

xmlns 値で Linq to Xml を使用するには?

4

4 に答える 4

92

LINQ to XMLメソッドのようDescendantsElementXName引数として。stringからへの変換がXName自動的に行われます。これを修正するには、 and呼び出しXNamespaceの文字列の前にbeforeを追加します。2つの異なる名前空間が機能しているので注意してください。DescendantsElement


string theXml =
                @"true1";

            //string theXml = @"true1";

    XDocument xmlElements = XDocument.Parse( theXml );
    XNamespace ns = "http://myvalue.com";
    XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace";
    var elements = from data in xmlElements.Descendants( ns + "Result" )
          select new
                 {
                     TheBool = (bool) data.Element( nsa + "TheBool" ),
                     TheId = (int) data.Element( nsa + "TheId" ),
                 };

    foreach ( var element in elements )
    {
        Console.WriteLine( element.TheBool );
        Console.WriteLine( element.TheId );
    }

Descendantsnsinとnsainの使用に注意してくださいElements

于 2010-02-26T09:14:35.050 に答える
26

名前空間を持つXNameDescendants()およびElement()に渡すことができます。文字列を Descendants() に渡すと、名前空間のない XName に暗黙的に変換されます。

名前空間に XName を作成するには、XNamespace を作成し、それを要素 local-name (文字列) に連結します。

XNamespace ns = "http://myvalue.com";
XNamespace nsa = "http://schemas.datacontract.org/2004/07/My.Namespace";

var elements = from data in xmlElements.Descendants( ns + "Result")
                   select new
                              {
                                  TheBool = (bool)data.Element( nsa + "TheBool"),
                                  TheId = (int)data.Element( nsa + "TheId"),
                              };

文字列からの暗黙的な変換によって名前空間を持つ XName を作成するための省略形もあります。

var elements = from data in xmlElements.Descendants("{http://myvalue.com}Result")
                   select new
                              {
                                  TheBool = (bool)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheBool"),
                                  TheId = (int)data.Element("{http://schemas.datacontract.org/2004/07/My.Namespace}TheId"),
                              };

または、XElement に対してクエリを実行できます。名前.ローカル名。

var elements = from data in xmlElements.Descendants()
                   where data.Name.LocalName == "Result"
于 2010-02-26T09:06:27.407 に答える
0

VB.NET で名前空間を持つ属性を読み取るために、次のコードが正常に機能することがわかりました。

MyXElement.Attribute(MyXElement.GetNamespaceOfPrefix("YOUR_NAMESPACE_HERE") + "YOUR_ATTRIB_NAME")

これが誰かの助けになることを願っています。

于 2016-04-04T17:40:28.670 に答える