2013-03-20 42 views
0

控制器响应包括“spec?”现场:Nokogiri:字段名称中带```的字符串创建xml

r = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<hash type=\"array\">\n <item><spec? type=\"boolean\">false</spec?>\n </item>\n <hash>\n" 

当试图从它创建XML与Nokogiri.xml(r)收到字面上:

<?xml version="1.0" encoding="UTF-8"?> 
<hash type="array"> 
    <item><spec type=" type=&quot;boolean&quot;&gt;false/spec"> 
</spec>item&gt; 
    <hash> 
</hash></item></hash> 

这是奇怪的事情;

我的问题是: 是有可能创造使用引入nokogiri,解析或删除?和其他非XML的非标准字符,在Nokogiri.XML()阶段串XML?

Desirible结果:

Nokogiri.xml(r) do |config| 
config.maybe_some_configs? 
end #=> 
    <?xml version="1.0" encoding="UTF-8"?> 
    <hash type="array"> 
     <item><spec type="boolean">false</spec></item>  
    </hash> 

回答

1

解析字符串到一个XML DOM是Nokogiri::XMLNokogiri.XMLNokogiri::XML.parse,但没有使用xml的正确方法。

此外,XML标签不能包含?。有关更多信息,请参阅the spec。您必须仔细阅读“名称和标记”部分并解码十六进制字符描述以找出允许的字符范围,但有一个提示是?是字符代码0x3f

导致一个事实,即在r的XML是无效的:

<?xml version="1.0" encoding="UTF-8"?> 
<hash type="array"> 
    <item><spec? type="boolean">false</spec?> 
</item> 
    <hash> 

,当在分析结果:

irb(main):012:0> doc = Nokogiri::XML(r) 
#<Nokogiri::XML::Document:0x80c8014c name="document" children=[#<Nokogiri::XML::Element:0x80c7399c name="hash" attributes=[#<Nokogiri::XML::Attr:0x80c733e8 name="type" value="array">] children=[#<Nokogiri::XML::Text:0x80c6e26c "\n ">, #<Nokogiri::XML::Element:0x80c6df60 name="item" children=[#<Nokogiri::XML::Element:0x80c6d970 name="spec">, #<Nokogiri::XML::Text:0x80c6d09c "? type=\"boolean\">false">]>, #<Nokogiri::XML::Text:0x80c6ca34 "?>\n ">]>]> 
irb(main):013:0> doc.errors 
[ 
    [0] #<Nokogiri::XML::SyntaxError: error parsing attribute name>, 
    [1] #<Nokogiri::XML::SyntaxError: attributes construct error>, 
    [2] #<Nokogiri::XML::SyntaxError: Couldn't find end of Start Tag spec line 3>, 
    [3] #<Nokogiri::XML::SyntaxError: expected '>'>, 
    [4] #<Nokogiri::XML::SyntaxError: Opening and ending tag mismatch: item line 3 and spec>, 
    [5] #<Nokogiri::XML::SyntaxError: Opening and ending tag mismatch: hash line 2 and item>, 
    [6] #<Nokogiri::XML::SyntaxError: Extra content at the end of the document> 
] 

其结果是,引入nokogiri是不得不做一些修正在DOM试图理解它。生成的XML看起来像:

irb(main):014:0> puts doc.to_xml 
<?xml version="1.0" encoding="UTF-8"?> 
<hash type="array"> 
    <item><spec/>? type="boolean"&gt;false</item>?&gt; 
</hash> 

修复它是给引入nokogiri 有效 XML的方式。修正XML的来源,如果您控制它,或者在将字符串中的问题传递给Nokogiri之前修正它们中的问题。

根据其定义,XML是一种严格的格式,Nokogiri对此表示赞赏,并试图保持友好,使您可以检查errors以查看其是否为empty?。如果不是的话,赔率是好的,你不应该继续使用源,直到你确定的问题和固定的任何原因解析问题。有时候问题是相当温和的,你可以忽略它,但无论如何,你至少应该知道它。

预按摩数据引入nokogiri看到它并不难前:

doc = Nokogiri::XML(r.gsub('spec?', 'spec')) 

irb(main):024:0> puts doc.to_xml 
<?xml version="1.0" encoding="UTF-8"?> 
<hash type="array"> 
    <item><spec type="boolean">false</spec> 
</item> 
    <hash> 
</hash></hash> 
nil 
irb(main):025:0> doc.errors 
[ 
    [0] #<Nokogiri::XML::SyntaxError: Premature end of data in tag hash line 5>, 
    [1] #<Nokogiri::XML::SyntaxError: Premature end of data in tag hash line 2> 
] 

这是一个开始,而不是试图彻底为您解决问题。我教你钓鱼,而不是发放鱼。

相关问题