目标是更改特定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>
元素可以出现多次,但是MoveMe
和Target
元素都是单个的。你知道吗
如果是这么简单
查找
(?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]*?))))>
相关问题 更多 >
编程相关推荐