使用python正则表达式更改xml元素顺序

2024-04-16 08:40:23 发布

您现在位置:Python中文网/ 问答频道 /正文

目标是更改特定xml标记(及其内容)在给定字符串中的位置—最好使用regex。
字符串(表示我的xml数据)的结构是<MoveMe>元素出现在<Target>元素之前。你知道吗

如何将所有的<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:
s_pat = "(<(xsi:)?MoveMe>(.*?)<\/(xsi:)?MoveMe>)"

注意,<table>元素可以出现多次,但是MoveMeTarget元素都是单个的。你知道吗


Tags: 元素targetversiontablebodytemplaterooth2
1条回答
网友
1楼 · 发布于 2024-04-16 08:40:23

如果是这么简单

查找 (?s)([^\S\r\n]*<MoveMe>.*?</MoveMe>[^\S\r\n]*(?:\r?\n)?)(.*?<Target>.*?</Target>[^\S\r\n]*(?:\r?\n)?)
更换
$2$1

不过,一般来说,下面只提供了解析标记的正则表达式,这对您来说可能有点太多了。你知道吗

这只是解析一个原子标记。实际处理嵌套和闭包
完全是另一个问题。你知道吗

<(?:(?:(?:(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]*?))))>

相关问题 更多 >