it-swarm.dev

Použijte Linq na Xml s jmennými prostory Xml

Mám tento kód:

/*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);
}

Když používám první hodnotu pro XML, výsledek je null, zatímco s druhou mám dobré hodnoty ...

Jak používat Linq to Xml s hodnotami xmlns?

56
Tim

Metody LINQ to XML jako Descendants a Element berou XName jako argument. Převod z string na XName se děje automaticky. To lze opravit přidáním XNamespace před řetězce v volání Descendants a Element. Dejte si pozor, protože máte v práci 2 různé jmenné prostory.


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 );
    }

Všimněte si použití ns v Descendants a nsa v Elements

86
Mike Two

XName s jmenným prostorem můžete předat Descendants () a Element () . Když předáte řetězec Descendants (), je implicitně převeden na XName bez jmenného prostoru.

Chcete-li vytvořit XName v oboru názvů, vytvořte prostor XNamespace a zřetězte jej s elementem local-name (řetězec).

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"),
                              };

K dispozici je také zkratková forma pro vytvoření XName s jmenným prostorem přes implicitní převod z řetězce.

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"),
                              };

Případně můžete dotazovat na XElement. Name.LocalName .

var elements = from data in xmlElements.Descendants()
                   where data.Name.LocalName == "Result"
25
Lachlan Roche

Mám několik jmenných prostorů, které jsou uvedeny v horní části dokumentu XML, opravdu se nestarám o to, které prvky jsou z jakého oboru názvů. Chci jen dostat prvky podle jejich jmen. Tuto metodu rozšíření jsem napsal.

    /// <summary>
    /// A list of XElement descendent elements with the supplied local name (ignoring any namespace), or null if the element is not found.
    /// </summary>
    public static IEnumerable<XElement> FindDescendants(this XElement likeThis, string elementName) {
        var result = likeThis.Descendants().Where(ele=>ele.Name.LocalName==elementName);
        return result;
    }
2
mike nelson

Našel jsem následující kód pracovat správně pro čtení atributů s jmennými prostory ve VB.NET:

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

Doufám, že to pomůže někomu po silnici.

0
dotNET