2012-07-27 68 views
0

我得到一个'xml'字符串,其中包含一些未转义的内容。下面是一个简单的例子:如何在原始字符串中转义xml内容?

<link text="This is some text with "potentially" some quoted text in it." linktype="external" anchor="" target="" /> 

我的问题是,当你尝试上述转换为使用XmlDocument.LoadXml()字符串,LoadXml()抛出由于缺乏逃避对所持内容的内部报价异常属性'文本'。有没有一种相对无痛的方式来具体逃避内容?或者我只是要解析它/自己逃脱/重建它?

我不会产生这样的文字,我刚从另一个进程得到它在这样的字符串:

"<link text="This is some text with "potentially" some quoted text in it." linktype="external" anchor="" target="" />" 
+0

我会看到有关获取任何生成XML的信息以首先生成_compliant_ XML。这不是你应该处理的事情。 – 2012-07-27 20:47:29

回答

1

您需要使用HTML字符编码,其中"&quot;

但你的输入是你必须找到一种方法来解析文本,并与它们的编码转换更换引号中的格式不正确的XML文本。也许一些正则表达式解析..

请考虑这只是一个创造性的方式来完成这项工作。我知道这是肮脏的,但在大多数情况下工作:

private static string XmlEncodeQuotes(string target) { 

     string result = string.Empty; 
     for (int i = 0; i < target.Length; i++) 
     { 
      if (target[i] == '"') 
      { 
       if (target[i - 1] != '=') 
        if (!Regex.IsMatch(target.Substring(i), @"^""\s[a-zA-Z]+=""")) 
        { 
         result += "&quot;"; 
         continue; 
        } 
      } 
      result += target[i]; 
     } 
     return result; 
    } 
+0

是的,我希望有一种不那么痛苦的方式来做到这一点内置.NET已经开始尝试写正则表达式的清理它... – 2012-07-27 20:32:53

+0

其实我认为这是相当不可能的,否则,因为如果你开始思考正则表达式,你会看到你需要大量的盲猜 – 2012-07-27 20:34:18

+0

这实际上是非常接近我需要的,只需做一个小的调整来处理正则表达式匹配一个空属性的结尾引用(如:'id =“”' )。 – 2012-07-30 13:33:50

0

你尝试过一个CDATA标签内包裹的XML文档的一部分?

+0

我不生成内容,所以我不能只更改生成上述字符串的过程,如果这就是你的意思。我从字面上得到上面的内容,就是这样。 – 2012-07-27 20:27:52

0

威尔System.Security.SecurityElement.Escape()为你工作?如果没有,那么还有一个XmlTextWriter。

+0

我不是downvoting,但不是!不起作用!它只会翻译任何“无效”字符 – 2012-07-27 20:45:33

+0

好的,我重读了它,并且我认为您正在寻找将您收到的值写入不同的XML文件,但是如果您想分析它并且它无效,那么您可能需要自己解析它或者让数据提供商向您发送正确转义的XML片段,具体取决于您发送的片段范围的限制程度(即,如果它们总是这种“链接”风格,那么自解析很容易足够)。 – 2012-07-27 20:48:49

0

如果你只是问如何逃生报价,这与

&quot; 

做我不知道你正在处理什么用,但你的问题的根源是,该数据你收到的是畸形的。

  • 选项1)除非清理数据,否则很难让大多数解析器加载无效的XML数据。有些人比其他人更宽容。你可能有一些运气的HTML Agility Pack

  • 选项2)Use Regular Expressions to fix your XML.

  • 选项3)如果编码解析方案是不是一种选择使用XSLT。只需创建转换,然后添加一个模板来解决问题。

相关问题