2017-07-13 3 views
1

CDATAを含むXMLファイルが、最初に]]>と見なされると、予期せず破損します。不正な形式のCDATAセクションをXMLファイルで検出して修復するにはどうすればよいですか?

]]>]]]]><![CDATA[>に置き換えようとしています。それは]]>と一致しますが、]]></Bold>または]]>]]></Bold>ではありません。

ここにXMLファイルがあります。

<article> 
<Date>2011-04-22T10:09:18Z</Date> 
<Heading><![CDATA[data - content ]]></Heading> 
<Body><![CDATA[contene - data Normal data. ]]></Body> 
</article> 

<article> 
<Date>2011-02-26T12:48:09Z</Date> 
<Heading><![CDATA[Content]]></Heading> 
<Body><![CDATA[ Content-abc 

Help 
]]> 
{# #} 
Content data - 

MORE style="position: relative; left: -35%;" /> ]]> More 
    0) { %> 
0) { %> 
0) { %> 
]]>]]></Body> 
</article> 

<article> 
<Date>2011-04-22T10:09:18Z</Date> 
<Heading><![CDATA[data - content ]]></Heading> 
<Body><![CDATA[contene - data Normal data. ]]></Body> 
</article> 
+9

**マルチレベル/階層構造の解析/修正に正規表現を使用しないでください。 – zwer

+4

[XMLを解析するために単純な正規表現を使用しない](https://stackoverflow.com/a/1732454/918959)(単一のCDATAフラグメントでは機能するかもしれないが) –

+1

これは、XMLプロセッサが解析する方法とまったく同じですcdata '<!\\ CDATA \ [[\ S \ s] *?\] \]>'あなたが意味することを言います。 – sln

答えて

0

あなたはその後、コメント<!-- xxx -->に変換し、少なくとも]]>年代の全体
誤ったセットを取得することにより、ダメージを焼灼に試すことができます。

このようにして、停止しなくなり、残りのレコードを取得できるようになります。

私は本当にこの単純な正規表現は本当に(笑)準備ができてXML解析
ではありませんどのように説明したいが、それは言って十分ではありません、これはただの修理と
サルベージ操作です。

一部ノート - 全体アサーション及びグループ1は(Pythonのreがサポートしていない)
擬似原子団として使用されています。

正規表現
(?=(<!\[CDATA\[[\S\s]*?\]\]>))\1((?:(?:(?!<!\[CDATA\[[\S\s]*?\]\]>)[\S\s])*\]\]>)+)

書式

(?= 
     (<!\[CDATA\[ [\S\s]*? \]\]>) # (1) 
) 
\1 
(       # (2 start) 
     (?: 
      (?: 
       (?! <!\[CDATA\[ [\S\s]*? \]\]>) 
       [\S\s] 
      )* 
      \]\]> 
    )+ 
)        # (2 end) 

Pythonサンプル

import re 

def callback(match): 
    # Here you can further parse and/or do subs on 'group(2)' 
    # the errant set of `]]>aa]]>]]>', etc. 
    # For this we just cauterize it by enclosing in a comment block. 
    return match.group(1) + '<!-- ' + match.group(2) + '-->' 

xml = ' <article><Date>2011-04-22T10:09:18Z</Date><Heading><![CDATA[data - content ]]></Heading><Body><![CDATA[contene - data Normal data. ]]></Body></article> <article><Date>2011-02-26T12:48:09Z</Date><Heading><![CDATA[Content]]></Heading><Body><![CDATA[ Content-abc Help ]]> {# #} Content data - MORE style="position: relative; left: -35%;" /> ]]> More 0) { %> 0) { %> 0) { %> ]]>]]></Body></article><article><Date>2011-04-22T10:09:18Z</Date><Heading><![CDATA[data - content ]]></Heading><Body><![CDATA[contene - data Normal data. ]]></Body></article>' 
xml = '<root>' + xml + '</root>' 

xmlnew = re.sub(r'(?=(<!\[CDATA\[[\S\s]*?\]\]>))\1((?:(?:(?!<!\[CDATA\[[\S\s]*?\]\]>)[\S\s])*\]\]>)+)', callback, xml)  

print(xmlnew)  

http://rextester.com/YACZ64236

Oputputがブラウザで表示

<?xml version="1.0"?> 
-<root> 
    -<article> 
     <Date>2011-04-22T10:09:18Z</Date> 
     -<Heading> 
      <![CDATA[data - content ]]> 
     </Heading> 
     -<Body> 
      <![CDATA[contene - data Normal data. ]]> 
     </Body> 
    </article> 
    -<article> 
     <Date>2011-02-26T12:48:09Z</Date> 
     -<Heading> 
      <![CDATA[Content]]> 
     </Heading> 
     -<Body> 
      <![CDATA[ Content-abc Help ]]> 
      <!-- {# #} Content data - MORE style="position: relative; left: -35%;" /> ]]> More 0) { %> 0) { %> 0) { %> ]]>]]>--> 
     </Body> 
    </article> 
    -<article> 
     <Date>2011-04-22T10:09:18Z</Date> 
     -<Heading> 
      <![CDATA[data - content ]]> 
     </Heading> 
     -<Body> 
      <![CDATA[contene - data Normal data. ]]> 
     </Body> 
    </article> 
</root> 
関連する問題