XML解析:检查字符串C ++中的字符串

时间:2010-03-10 20:36:17

标签: c++ xml parsing string

我编写了一个简单的C ++ shell程序来解析大型XML文件并修复语法错误。

到目前为止,我已经涵盖了我能想到的所有内容,例如字符串中的字符串,例如。

<ROOT>
  <NODE attribute="This is a "string within" a string" />
<ROOT>

我的程序逐个字符地循环遍历整个xml文件(为了提高效率,一次只在内存中保留几个字符),它会查找诸如&amp;&lt;&gt;之类的内容。等等,并使用&amp; &gt; &lt;等来逃避它们。我正在做的一个基本示例可以在已接受的答案中找到Escaping characters in large XML files

问题是:我可以使用什么条件或逻辑来检测“字符串内部”以便能够将引号转义为:

<ROOT>
  <NODE attribute="This is a &quot;string within&quot; a string" />
<ROOT>

甚至可能吗?

2 个答案:

答案 0 :(得分:4)

更好的解决方案是在创建之前修复这些错误。 XML被设计为超级严格,以避免必须进行这些猜测。如果XML无效,那么您唯一应该做的就是拒绝它,并输出有用的错误消息。

谁说你的更正:

<NODE attribute="This is a &quot;string within&quot; a string" />

优于

<NODE attribute="This is a " string-within=" a string" />

显然,有了理解英语的好处,我们可以肯定它是前者,但是当你采用自动化方法时,没有办法确定你没有掩盖更严重错误。

解决转义问题的地方是在创建xml文件时。

答案 1 :(得分:1)

我认为很难确定属性的结束位置和另一个属性的开始。我认为你需要限制你可以解析的输入,否则你会有一些模糊的情况,比如这个:

<ROOT>
  <NODE attribute="This is a "string within" a string" attribute2="This is another "string within" a string" />
<ROOT>

这些是两个属性或一个属性。

您可以做出的一个假设是,在相同数量的双引号和等号之后,新属性开始。然后,您只需用转义字符串替换所有内部双引号。或两个以上的双引号之后的任何等号意味着新的属性。节点结束也可以假设相同。