3

我有这个部分 XML

   string = ''' 
   <x:root>
       <x:tag1 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue" />
       <x:tag2 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue">
          someValue
       </x:tag2>
       <x:tag3> someValue
    '''

现在我想“愚蠢地”修复它。我想到了一种方法——正则表达式所有的开始元素和结束元素——>检查哪个元素丢失并添加它。当然不会涉及太多细节。到目前为止我得到的是(这不起作用):

import re
starts = re.compile('(?<=<)x:\w+(?=>)|(?<=<)x:\w+(?! .+ />)')
print(start.findall(string))

我期望的是 x:root , x:tag2 , x:tag3 的列表

我一直在谷歌搜索并尝试了很多,但找不到答案。我从这个表达式中得到的唯一东西是 x:root 、 x:tag1 、 x:tag3。

请帮忙

谢谢

4

3 回答 3

1

BeautifulSoup或许可以修复它:

import BeautifulSoup

content = ''' 
<x:root>
   <x:tag1 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue" />
   <x:tag2 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue">
      someValue
   </x:tag2>
   <x:tag3> someValue
'''

soup = BeautifulSoup.BeautifulStoneSoup(content)
print(soup.prettify())

产量

<x:root>
 <x:tag1 x:anyattrib="anyValue" x:anyattrib="anyValue" x:anyattrib="anyValue">
  <x:tag2 x:anyattrib="anyValue" x:anyattrib="anyValue" x:anyattrib="anyValue">
   someValue
  </x:tag2>
  <x:tag3>
   someValue
  </x:tag3>
 </x:tag1>
</x:root>
于 2012-10-25T21:56:48.170 回答
0

使用sgmlib默认python附带的... 输入1

string1 = '''
   <root xmlns:x='www.test.com'>
       <x:tag1 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue" />
       <x:tag2 x:anyAttrib="anyValue" x:anyAttrib="anyValue" x:anyAttrib="anyValue">
          someValue
       </x:tag2>
       <x:tag3> someValue
    '''

import re
import sgmllib
sgmllib.tagfind = re.compile('[a-zA-Z][-_.:a-zA-Z0-9]*')
starts = re.findall(sgmllib.tagfind, string1)
print starts

输出1

['root', 'xmlns:x', 'www.test.com', 'x:tag1', 'x:anyAttrib', 'anyValue', 'x:anyAttrib', 'anyValue', 'x:anyAttrib', 'anyValue', 'x:tag2', 'x:anyAttrib', 'anyValue', 'x:anyAttrib', 'anyValue', 'x:anyAttrib', 'anyValue', 'someValue', 'x:tag2', 'x:tag3', 'someValue']

或输入2

starts1 = re.finditer(sgmllib.tagfind, string1)
for x in starts1:
    print x.start(), x.end(), x.group(0)

输出2:

5 9 root
10 17 xmlns:x
19 31 www.test.com
42 48 x:tag1
49 60 x:anyAttrib
62 70 anyValue
72 83 x:anyAttrib
85 93 anyValue
95 106 x:anyAttrib
108 116 anyValue
129 135 x:tag2
136 147 x:anyAttrib
149 157 anyValue
159 170 x:anyAttrib
172 180 anyValue
182 193 x:anyAttrib
195 203 anyValue
216 225 someValue
235 241 x:tag2
251 257 x:tag3
259 268 someValue

或使用elementTree默认python附带的。http://docs.python.org/2/library/xml.etree.elementtree.html

于 2012-11-24T10:48:24.860 回答
0

感谢亚历克西斯帮助我。

正确的表达是:

re.findall(r'<\s*(w:\w+)[^>]*(?<!/)>', string)

使用此表达式,您将能够提取两种情况:

第一的<tag>

第二<tag attrib1="value" attrib2="value" attribN="value"/>

我尝试使用一些内置的 python 解析器,但没有成功,包括 Beautifulsoup,不幸的是它没有完全按照我预期的方式修复 XML。

祝你有个好的一天!:)

于 2012-11-24T09:56:30.280 回答