使用XmlDocument加载具有多个URL的字符串

时间:2016-04-01 18:19:58

标签: c# regex xml escaping xmldocument

我正在尝试使用XmlDocument

加载带URL的xml字符串
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>");

我想做一些类似的事情,但对于使用良好替换方法的多个网址。 (也许使用正则表达式)

示例字符串输入

<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>

我的输入必须是一个字符串。

还有更好的方法来解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

我现在看到你的问题了。您的XML无效。除非在CDATA部分中,否则需要转义&符号。有关详情,请参阅此帖子:What characters do I need to escape in XML documents?

修复您的XML并且不会出现问题。您可以使用以下网站测试XML:http://www.xmlvalidation.com/

有效XML的示例:

<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>

以下是一个实际可行的示例(在visual studio中测试)。

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);
        }
    }
}

答案 1 :(得分:0)

我为此创建了自己的方法

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