2010-03-10 117 views
1

我编写了一个简单的C++ shell程序来解析大型XML文件并修复语法错误。例如,我已经覆盖了我能想到的除字符串内的所有字符串外的所有内容。XML解析:检查字符串C++中的字符串

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

我的程序循环通过字符整个xml文件的字符(保持在内存中在时间效率只有几个字符),它看起来的东西,如& <>等,并与&amp; &gt; &lt;等他们逃脱我在做什么一个基本的例子可以接受的答案中找到此Escaping characters in large XML files

的问题是:什么是能够引号逃脱这个我可以用它来“中的字符串”检测条件或逻辑:

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

它甚至可能吗?

回答

1

我认为很难确定属性结束位置和另一个位置开始。我认为你需要限制可能的输入可以解析,否则你将有不确定的情况下像这样的:

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

这是以下两种属性或一个属性。

你可以做的一个假设是,在相同数量的双引号和等号后开始一个新属性。然后你简单地用你的转义字符串替换所有的内部双引号。或者2个或更多双引号之后的任何等号意味着新的属性。对于节点的末端可以假定相同。

4

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

谁在说,你的修正:

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

优于

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

显然,随着理解英语的好处,我们可以相当肯定是前者,但是当你我们正在采取一种自动化的方法,没有办法确定你没有掩盖更严重的错误。

修复转义问题的地方在于创建xml文件的时候。

+0

问题是我没有权力如何生成XML,这是给我这样的,我必须自己修复它。这不是一个大问题,但我想尽可能地自动化。 – 2010-03-10 21:46:21