设置根XElement的值而不影响子元素

时间:2013-03-06 20:09:16

标签: c# xml .net-3.5 linq-to-xml

更新:我仍然有这个问题,更好的解释。

我有一个XElements列表,我正在迭代它们以检查它是否与正则表达式模式匹配。如果匹配,我需要替换当前元素的值而不影响他的子元素。

例如,

<root>{REGEX:@Here}<child>Element</child> more content</root

在这种情况下,我需要替换根元素下的{REGEX:@Here}但不是子元素!如果使用:

string newValue = xElement.ToString();
if(ReplaceRegex(ref newValue))
   xElement.ReplaceAll(newValue);

我丢失了子元素,标签转换为&amp;孩子&amp; gt;值中的元素。 如果我使用:

xElement.SetValue(newValue);

xElement的值为

"{REGEX:Replaced} Element more content"

因此也失去了儿童元素。

如果正则表达式模式位于根元素或子元素下,我该怎么做才能替换保持子元素和值的值。

PS:我将在此处添加正则表达式函数以便理解

    private bool ReplaceRegex(ref string text)
    {
        bool match = false;
        Regex linkRegex = new Regex(@"\{XPath:.*?\}", System.Text.RegularExpressions.RegexOptions.Multiline);

        Match m = linkRegex.Match(text);

        while (m.Success)
        {
            match = true;
            string substring = m.Value;
            string xpath = substring.Replace("{XPath:", string.Empty).Replace("}", string.Empty);

            object temp = this.Container.Data.XPathEvaluate(xpath);

            text = text.Replace(substring, Utility.XPathResultToString(temp));

            m = m.NextMatch();
        }
        return match;
    }

1 个答案:

答案 0 :(得分:2)

private void ReplaceRegex(XElement xElement)
{
    if(xElement.HasElements)
    {
        foreach (XElement subElement in xElement.Elements())
            this.ReplaceRegex(subElement);
    }
    foreach(var node in xElement.Nodes().OfType<XText>())
    {
        string value = node.Value;
        if(this.ReplaceRegex(ref value))
            node.Value = value;
    }
}

编辑:

关于您的混合内容评论,编辑了代码以处理文本节点。看看它是否有效。