【发布时间】: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?
-
如果你有
<Root>This is <b>mixed</b> content</Root>,那么根节点的值为This is mixed content。如果您希望正则表达式针对整个字符串运行,您将丢失<b>标记。另一方面,您可以只遍历子节点,只在文本节点“This is”、“mixed”和“content”上运行正则表达式。
标签: c# xml .net-3.5 linq-to-xml