1

更新: 私はまだこの問題を抱えています。より良い説明です。

XElements のリストがあり、正規表現パターンと一致するかどうかを確認するためにそれらを繰り返し処理しています。一致する場合は、子要素に影響を与えずに現在の要素の値を置き換える必要があります。

例えば、

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

1 に答える 1

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

編集 :

混合コンテンツのコメントについては、テキスト ノードを処理するようにコードを編集しました。それが機能するかどうかを確認してください。

于 2013-03-06T21:05:09.260 に答える