Ich habe das Web ein wenig dafür gesucht und auch eine Lösung für mein Problem gefunden, aber ich glaube, es könnte möglich sein, die Menge an erforderlichen Code zu reduzieren. Ich hatte gehofft, du könntest mir helfen.Wie kann ich Kinderknoten intertext von einem anderen childnode bekommen
Ich habe das folgende XML und ich muss den Wert von Titel durch die ID erhalten. (In diesem Fall Ich interessiere mich für den Titel „somefile2.jpg“, die ich brauche, um die ID von „2“ zu finden)
<entry>
<name></name>
<title type="text">somefile1.jpg</title>
<m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
<d:path></path>
<d:id>1</d:id>
</m:properties>
</entry>
<entry>
<name></name>
<title type="text">somefile2.jpg</title>
<m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
<d:path></path>
<d:id>2</d:id>
</m:properties>
</entry>
<entry>
<name></name>
<title type="text">somefile3.jpg</title>
<m:properties xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices">
<d:path></path>
<d:id>3</d:id>
</m:properties>
</entry>
das ich den folgenden Code ausführen zu lösen:
XmlDocument xDoc = new XmlDocument();
xDoc.LoadXml(xmlfile);
XmlNamespaceManager nameSpaceManager = new XmlNamespaceManager(xDoc.NameTable);
nameSpaceManager.AddNamespace("b", "http://www.w3.org/2005/Atom");
nameSpaceManager.AddNamespace("m", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata");
nameSpaceManager.AddNamespace("d", "http://schemas.microsoft.com/ado/2007/08/dataservices");
//Find the correct XML node by child ID and get it's title
XmlNode parentNode = null;
string incomingID = "2";
foreach (XmlNode node in xDoc.SelectNodes(@"//m:properties/d:id", nameSpaceManager))
{
if (node.InnerText == incomingID)
{
parentNode = node.ParentNode.ParentNode;
break;
}
}
//Add the nodes to a new XML document so it can be traversed
XmlDocument parent = new XmlDocument();
parent.LoadXml("<root>" + parentNode.InnerXml + "</root>");
XmlNamespaceManager parentNameSpaceManager = new XmlNamespaceManager(parent.NameTable);
parentNameSpaceManager.AddNamespace("b", "http://www.w3.org/2005/Atom");
parentNameSpaceManager.AddNamespace("m", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata");
parentNameSpaceManager.AddNamespace("d", "http://schemas.microsoft.com/ado/2007/08/dataservices");
string xmlFilename = parent.GetElementsByTagName("title")[0].InnerText;
Wenn möglich, möchte ich den Code ändern, so dass ich kein ganz neues XmlDocument erzeuge, nur um den Titel zu finden. Denkst du, dass es möglich ist, den Titel durch einen kürzeren Code zu bekommen? etwas in der Linie von Ich dachte:
string xmlFilename = xDoc.SelectSingleNode(@"//m:properties[id='" + incomingID + "']", nameSpaceManager).ParentNode.ParentNode.FirstChild["title"].InnerText;
Wenn ich den obigen Code ausführen gibt es eine Ausnahme: Object nicht auf eine Instanz eines Objekts
Nun kann ich natürlich tun, was funktioniert, aber ich hatte auf etwas mehr Dynamik gehofft, so dass ich nicht direkt steuern, welcher Knoten in der Struktur zu bekommen: string xmlFilename = parentNode.FirstChild.NextSibling.InnerText; – Ghost