2016-06-08 18 views
0

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

+0

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

Antwort

1

Omg .. wie immer, wenn Sie auf dem Laufenden haben Eine Frage, die Sie nicht lange nach der Antwort finden. Das war meine Lösung:

string xmlFilename = parentNode["title"].InnerText; 

Dies bedeutet, dass ich endlich das schreckliche 2. XmlDocument entfernen kann. :)