如何循环遍历XML中的所有节点并根据其在C#中的值更改节点值?

时间:2011-05-12 15:58:31

标签: c# xml regex

   <result>
        <relatedProducts>
        <item>
            <id></id>
            <name></name>
            <text></text>
        </item>
        <item>
            <id></id>
            <name></name>
            <text></text>
        </item>
        <item>
            <id></id>
            <name></name>
            <text></text>
        </item>
        ...
        </relatedProducts>
        <item>
            <id></id>
            <name></name>
            <intro></intro>
            <detail></detail>
        </item>
            <item>
            <id></id>
            <name></name>
            <intro></intro>
            <detail></detail>
        </item>
        ... 
    </result>

这是我想要使用的xml文件的简化XML结构。

节点文本中可能有网站网址,例如

<text>...href="something.com/default.aspx?id=3"...</text>

<detail>...href="something.com/default.aspx?id=25"...</detail>

我想要的是在C#中遍历此xml文档中的所有节点并检查URL链接,然后根据该链接中的id更改链接。例如,

我使用正则表达式检查每个节点值,我看到这个URL符合模式

<text>...href="something.com/default.aspx?id=3"...</text>

我想把它改成

<text>...href="somethingelse.com/query.aspx?rid=3"...</text>

最后,使用正确的URL返回整个xml文档。

2 个答案:

答案 0 :(得分:5)

XDocument doc = XDocument.Load(path);
foreach(var element in doc.Descendants())
{
    element.Value = ReplaceUrl(element.Value);
}
doc.Save(path);

我会让你实施ReplaceUrl方法,因为我不确切知道你需要做什么......只是一些一般的建议:

  • 您可以使用正则表达式从元素文本中提取URL(请参阅this question
  • 解析和修改URL的最简单方法可能是使用UriBuilder类,它允许您访问URL的各个组件(方案,主机,路径,查询字符串......)

答案 1 :(得分:1)

    Dim xmlDoc As New XmlDocument
    Dim xmlNodeList As XmlNodeList
    Dim xmlNode As XmlNode

    xmlDoc.LoadXml(strXML)
    'xmlNodeList = xmlDoc.GetElementsByTagName("text")'Do this if its a particular tag
    xmlNodeList = xmlDoc.GetElementsByTagName("result")'Or just put the root tag, in my   
                                                       'case result was the root tag

    For Each xmlNode In xmlNodeList
        xmlNode.InnerText = "new text"
    Next

搜索特定标记,然后进行替换。