2017-03-09 5 views
0

目標は、指定された文字列内の特定のXMLタグ(およびその内容)の位置を変更することです - 理想的にはregexを使用します。
文字列(私のxmlデータを表す)は、要素の前に表示される<MoveMe>要素の構造を持っています。Pythonの正規表現を使用してxml要素の順序を変更します

すべての移動方法<MoveMe>.*</MoveMe><xsi:MoveMe>.*</xsi:MoveMe>は、同等の後に発生します。</Target>または</xsi:Target> ??

入力:

<?xml version="1.0"?> 
<stylesheet version="1.0" xmlns:xsi="http://some.namespace.org"> 
    <template> 
     <root> 
      <body> 
       <h2>sample</h2> 
       <table> 
        <tr> 
         <th>Title</th> 
         <th>Artist</th> 
        </tr> 
        <MoveMe>Hans Müller fist 
         content 1 </MoveMe> 
        <Target> 
         <td>a1</td> 
         <td>b1</td> 
        </Target> 
       </table> 
       <table> 
        <tr><th>Title</th></tr> 
        <xsi:MoveMe>again</xsi:MoveMe> 
        <xsi:Target> 
         <td>x2</td> 
        </xsi:Target> 
       </table> 
      </body> 
     </root> 
    </template> 
</stylesheet> 

出力:

<?xml version="1.0"?> 
<stylesheet version="1.0" xmlns:xsi="http://some.namespace.org"> 
    <template> 
     <root> 
      <body> 
       <h2>sample</h2> 
       <table> 
        <tr> 
         <th>Title</th> 
         <th>Artist</th> 
        </tr> 
        <Target> 
         <td>a1</td> 
         <td>b1</td> 
        </Target> 
        <MoveMe>Hans Müller fist 
         content 1 </MoveMe> 
       </table> 
       <table> 
        <tr><th>Title</th></tr> 
        <xsi:Target> 
         <td>x2</td> 
        </xsi:Target> 
        <xsi:MoveMe>again</xsi:MoveMe> 
       </table> 
      </body> 
     </root> 
    </template> 
</stylesheet> 

は、これまでのところ、私はこのパターンを使用してMoveMeすべてのノードgrupusをキャプチャするために管理:<table>要素が発生する可能性があること
s_pat = "(<(xsi:)?MoveMe>(.*?)<\/(xsi:)?MoveMe>)"

注意を複数回であるが、MoveMeとの両方要素は単一です。

+1

は、正規表現でHTMLを解析に似ています。私はそれに答えてこの他の質問にあなたを参照します:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – grepe

+0

まあ、これはかなりあなたです私たちがここで扱っているケースでは、これはちょうど私が推測する文字列として考えることができます... - 他のトピックは、これをElementTreeオブジェクトに解析し、内部で子オーダーを操作しようとしますが、これは別の話です。 – modzello86

+0

_moveme_と_target_は隣接していますか? – sln

答えて

0

それがこの

のようなこの単純な、何かが、唯一の下にある
(?s)([^\S\r\n]*<MoveMe>.*?</MoveMe>[^\S\r\n]*(?:\r?\n)?)(.*?<Target>.*?</Target>[^\S\r\n]*(?:\r?\n)?)

$2$1

は一般的に、しかし、正規表現はTAGSを解析するために交換してください検索ならかもしれませんあなたのために少しだ。

これはちょうど原子タグを解析します。実際にはを入れ子に入れてとクロージャ
を入れてください。正規表現を使用してXMLを解析

<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>

関連する問題