Dies scheint nicht wie es schwierig sein sollte, aber ich bin derzeit stecken. Ich versuche, die Attributwerte für ein bestimmtes Attribut von Knoten zu erhalten, die mit einer bestimmten XPath-Abfragezeichenfolge übereinstimmen. Hier ist, was ich bisher:Erhalten Sie Attributwerte von übereinstimmenden XML-Knoten mit XPath-Abfrage
public static IEnumerable<string> GetAttributes(this XmlDocument xml,
string xpathQuery, string attributeName)
{
var doc = new XPathDocument(new XmlNodeReader(xml));
XPathNavigator nav = doc.CreateNavigator();
XPathExpression expr = nav.Compile(xpathQuery);
XPathNodeIterator iterator = nav.Select(expr);
while (iterator.MoveNext())
{
XPathNavigator curNav = iterator.Current;
if (curNav.HasAttributes)
{
XmlNode curNode = ((IHasXmlNode)curNav).GetNode();
if (null != curNode)
{
XmlAttribute attrib = curNode.Attributes[attributeName];
if (null != attrib)
{
yield return attrib.Value;
}
}
}
}
}
Das derzeit eine Ausnahme auslöst:
System.InvalidCastException: Kann nicht das Objekt des Typs ‚MS.Internal.Xml.Cache.XPathDocumentNavigator‘ werfen 'eingeben System.Xml.IHasXmlNode '.
Gehe ich falsch? Gibt es eine einfachere Möglichkeit, Attributwerte von übereinstimmenden Knoten zu erhalten?
Warum nicht LinqToXml verwenden? Dies würde den Lärm beträchtlich reduzieren, wenn ich nicht einen Grund vermisse, warum du das nicht mit Linq machen kannst? –