【问题标题】:Set value of root XElement without affecting child elements在不影响子元素的情况下设置根 XElement 的值
【发布时间】:2013-02-21 19:31:17
【问题描述】:

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

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

例如,

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

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

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

我丢失了子元素,标签被转换为值中的 & lt;child & 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;
    }

【问题讨论】:

  • Value 只返回连接的文本元素。您需要正则表达式在整个内容上运行,还是在单个文本元素上运行就足够了?
  • 我需要它在整个内容上运行
  • 那我觉得你倒霉了。您基本上是在说您想要获取一些内容,去除子标签,对其运行正则表达式,然后将标签放回结果中。但是这些标签会去哪里呢?
  • 嗯,我不确定您是否遇到了问题。我需要遍历所有元素(一种或另一种方式),获取每个元素的值,运行表达式,如果有匹配项,我会替换该值。不需要去掉标签来运行表达式,也许我应该使用 toString?
  • 如果你有&lt;Root&gt;This is &lt;b&gt;mixed&lt;/b&gt; content&lt;/Root&gt;,那么根节点的值为This is mixed content。如果您希望正则表达式针对整个字符串运行,您将丢失&lt;b&gt; 标记。另一方面,您可以只遍历子节点,只在文本节点“This is”、“mixed”和“content”上运行正则表达式。

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


【解决方案1】:
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;
    }
}

编辑:

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

【讨论】:

  • 如果模式仅在子元素中匹配,但我的根元素具有混合内容,这将起作用。 Some value value ,在这种情况下,子元素的值被替换,而不是根元素。
猜你喜欢
  • 1970-01-01
  • 2020-09-04
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多