1

私が抱えている問題は次のとおりです。

私の問題の根本的な原因は、「XML」解析 (XML は引用符で囲まれています。この場合、直接 XML ではないため) と空白です。

これを変換できる必要があります:

 "This is a <tag>string</tag>"

の中へ

 "This is a {0}"

ネストされたタグなどを処理できる必要があります。私の計画は、以下を使用して置換テキストを取得することでした。

 var v = XDocument.Parse(string.Format("<root>{0}</root>", myString),LoadOptions.PreserveWhitespace);
 var ns = v.DescendantNodes();
 var n = "" + ns.OfType<XElement>().First(node => node.Name != "root");

このコードは、一致するタグの最初のペアを返します。ネスティングなどを処理できます。唯一の本当の問題は、「PreserveWhitespace」オプションを使用しても、改行が削除されることです。 "\r\n"に変換されます"\n"。これにより一致が妨げられるため、次のようになります。

 myString = myString.Replace(n,"{0}");

期待どおりに動作しません。そのため、空白を無視して、置換を適切に機能させる方法を考え出そうとしていますが、開始方法がわかりません... 考えはありますか?

4

3 に答える 3

1

入力:

string s = "This <tag id=\"1\">string <inner><tag></tag></inner></tag> is <p>inside <b>of</b> another</p> string";

C# コード:

Match m;
do
{
  m = Regex.Match(s, @"\A([\s\S]*)(<(\S+)[^[<>]*>[^<>]*</\3>)([\s\S]*)\Z");
  if (m.Success) {
    s = m.Groups[1].Value + "{0}" + m.Groups[4].Value;
    System.Console.WriteLine("Match: " + m.Groups[2].Value);
  }
} while (m.Success);
System.Console.WriteLine("Result: " + s);

出力:

Match: <b>of</b>
Match: <p>inside {0} another</p>
Match: <tag></tag>
Match: <inner>{0}</inner>
Match: <tag id="1">string {0}</tag>
Result: This {0} is {0} string

このコードをここでテストします。

于 2012-11-19T22:27:06.190 に答える
0

CDATA セクションをお試しください。

v = XDocument.Parse(string.Format("<root><![CDATA[{0}]]></root>", myString));

便利なものは何もありませんが、その後のセレクターをいじって、子(テキストノード)を取得する必要があると思われます

于 2012-11-19T23:02:36.170 に答える
0

最善の解決策ではありませんが (あなたの にある場合'\n') myString、試してみる価値はあります:

myString =  myString.Replace(n.Replace("\n", "\r\n"), "{0}");
于 2012-11-19T22:18:18.207 に答える