2016-04-01 8 views
-2

Ich versuche, eine XML-Zeichenfolge mit URLs zu laden XmlDocument mitLast Zeichenfolge mit mehreren URLs XmlDocument mit

XmlDocument doc = new XmlDocument(); 

//This fails because url is not being escaped. 
doc.LoadXml("<item><name>http://google.com/test=aa&test2=22</name></item>"); 

//This passes as the url is being escaped. 
doc.LoadXml("<item><name>"+SecurityElement.Escape("http://google.com/test=aa&test2=22")+"</name></item>"); 

ich etwas ähnliches, aber für mehrere URLs tun wollen einen guten Ersatz-Methode. (Vielleicht mit Regex)

Beispiel String-Eingang

<item> 
    <name>http://google.com/test=aa&test2=22</name> 
    <name2>http://yahoo.com/test=aa&test2=22</name2> 
    <name><![CDATA[http://google.com/test=aa&test2=22]]></name> 
</item> 

Meine Eingabe ein String sein muss.

Gibt es auch einen besseren Weg, um dieses Problem zu lösen?

+0

"Dies schlägt fehl, da URL nicht entkommen wird"? Was scheitert, wie, was erwartest du von dieser Linie (was übrigens ganz gut funktioniert)? –

+0

@AlexeiLevenkov Entschuldigung. Ich habe diese hinzugefügt. Jedenfalls habe ich es aktualisiert. –

Antwort

0

habe ich meine eigene Methode für dieses

public string EscapeUrls(string url) 
    { 
     Regex regx = new Regex(@"(http|ftp|https)://([\w_-]+(?:(?:\.[\w_-]+)+))([\w.,@?^=%&:/~+#-]*[\[email protected]?^=%&/~+#-])?", RegexOptions.IgnoreCase); 
     MatchCollection mactches = regx.Matches(url); 
     foreach (Match match in mactches) 
     { 
      url = url.Replace(match.Value, SecurityElement.Escape(match.Value)); 
     } 
     return url; 
    } 
1

Ich sehe, was Ihr Problem jetzt ist. Sie haben ungültiges XML. Ampersands müssen außer in einem CDATA-Abschnitt maskiert werden. Weitere Informationen finden Sie in diesem Post: What characters do I need to escape in XML documents?

Fixieren Sie Ihr XML und es wird kein Problem geben. http://www.xmlvalidation.com/

Ein Beispiel für gültige XML:: Sie können Ihre XML mit Websites wie testen

<item> 
    <name>http://google.com/?test=aa&amp;test2=22</name> 
    <name2>http://yahoo.com/?test=aa&amp;test2=22</name2> 
    <name><![CDATA[http://google.com/?test=aa&test2=22]]></name> 
</item> 

Hier ist ein Beispiel, das (getestet in Visual Studio) tatsächlich funktioniert.

using System; 
using System.Xml; 

public class Program 
{ 
    public static void Main() 
    { 
     XmlDocument doc = new XmlDocument(); 

     doc.LoadXml(@"<item> 
      <name>http://google.com/?test=aa&amp;test2=22</name> 
      <name2>http://yahoo.com/?test=aa&amp;test2=22</name2> 
      <name><![CDATA[http://google.com/?test=aa&test2=22]]></name> 
      </item>"); 
     printNodes(doc);   
    } 

    private static void printNodes(XmlNode parent) 
    { 
     foreach (XmlNode node in parent.ChildNodes) 
     { 
      Console.WriteLine("[" + node.NodeType + "] " + node.Name + " = " + node.Value); 
      printNodes(node); 
     } 
    } 
} 
+0

Er klärte seine Fragen, die nur zeigten, dass er das klassische kaufmännische Und-und-Flucht-Problem hat. Es ist eine gültige Frage, aber wahrscheinlich eine von hundert ähnlich. Es hat tatsächlich einen Fehler in der Dotnetfiddle-Website mit Ampersands aufgedeckt, also war es definitiv keine Verschwendung. Ich habe es gemeldet. –

Verwandte Themen