2012-03-30 8 views
0

Ich habe eine [WebMethod] auf ASP.NET Web Service erstellt, die XML-Dokumente aus verschiedenen Web-Services (ASP.NET und PHP-Dienste) liest.Wie hängt man ChildNodes eines XML-Dokuments an den Stamm eines anderen an (Webservices)?

Sobald die Dokumente gelesen sind, werden sie in einem XML zusammengeführt und zurückgegeben.

Die Methode kann erfolgreich XML-Dokumente von jedem Webdienst lesen, aber wenn ich versuche, zweite XML in die erste anzufügen, bekomme ich ArgumentException und eine Nachricht wie diese The node to be inserted is from a different document context. Ich kann kein Problem finden, kann es etwas zu tun sein mit der Quelle des Dokuments? aber dann sind beide Dokumente genau gleich (haben dieselben Elemente).

Warum ArgumentException? Was vermisse ich?

[WebMethod] 
public XmlDocument getRestaurants(String search_keywords) 
{ 
    XmlDocument xmlDom1 = new XmlDocument(); 
    xmlDom1 = getRestaurantFromAspNetWS(search_keywords); 

    XmlTextReader myXmlTextReader = 
    new XmlTextReader 
    ("http://some-iss.green.com/username/search.php?s=" + search_keywords); 

    XmlDocument xmlDom2 = new XmlDocument(); 
    xmlDom2.Load(myXmlTextReader); 

    foreach (XmlElement xmlNode in xmlDom2.DocumentElement.ChildNodes) 
    { 
    //trying to append childNodes of xmlDom2 into xmlDom1 
    //and this is where i get ArgumentException 
    xmlDom1.DocumentElement.AppendChild(xmlNode); 
    } 

    return xmlDom1; 
} 
+0

Müssen Sie XmlDocument anstelle von LINQ to XML verwenden? –

+0

Ich würde lieber XmlDocument verwenden, bin aber offen, um neue Ideen zu erkunden. Würdest du etwas zum Lesen aufzeigen? Kannst du ein Problem mit dem obigen Code sehen? –

+0

Sie sollten 'XmlDocument.ImportNode' betrachten, aber ich würde Sie * dringend * dringend bitten, LINQ to XML zu betrachten. Es ist eine * erheblich * bessere XML API. –

Antwort

1

Sie müssen den Knoten mit importNode() so etwas importieren:

xmlDom1.DocumentElement.importNode(xmlNode, true); 
0

Können Sie schreiben es so?

public XElement getRestaurants(String search_keywords) 
{ 
    XElement result = getRestaurantFromAspNetWS(search_keywords); 

    XmlTextReader myXmlTextReader = new XmlTextReader 
     ("http://some-iss.green.com/username/search.php?s=" + search_keywords); 

    XElement reader = XElement.Load(myXmlTextReader); 
    foreach (XElement child in reader.Elements()) 
     result.Add(child); 

    return result; 
} 

Der eigentliche Trick ist Ihre benutzerdefinierte getRestaurantFromAspNetWS Funktion bekommen eine XElement anstelle eines XmlDocument zurückzukehren, da Sie nicht mit uns diese Funktion zu bieten hat, kann ich Ihnen nicht helfen.