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

虽然不是最好的解决方案(如果你只是'\n'在你的myString),但值得一试:

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

试试 CDATA 部分?

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

没有任何方便,但我怀疑你可能不得不在它之后弄乱选择器,并得到它的孩子(文本节点)

于 2012-11-19T23:02:36.170 回答