2010-05-23 4 views
1

xml.dom.minidom을 사용하여 만든 노드 xml.dom.Node 객체의 컬렉션이 있습니다. 노드 객체의 toxml() 메소드를 사용하여 문자열로 변환하여 데이터베이스에 개별적으로 저장합니다.파이썬에서 xml.dom.minidom 노드를 나타내는 문자열을 구문 분석하는 방법은 무엇입니까?

문제는 필자가 일종의 파서 (parser)를 사용하여 적절한 노드 객체로 다시 변환 할 수 있기를 바랍니다. 지금까지 파이썬과 함께 제공되는 다양한 라이브러리가 Expat를 사용하여 ''또는 실제로 올바른 XML 문자열이 아닌 문자열을 구문 분석하지 않습니다.

그럼 누구에게 아이디어가 있습니까? 어떤 방법으로 노드를 pickle하고 나서 unpickle 할 수 있다는 것을 알았지 만 불쾌감을 느끼고 유지 보수 목적으로 읽을 수있는 형태로 저장하고 싶습니다. 확실히 할 일이 있을까요? 의심에 응답

이것은,는 I의 의미 예 가능하다는 표현 "() .toxml"있어서 무언가를 만들지 않는다 말하면

>>> import xml.dom.minidom 
>>> x=xml.dom.minidom.parseString('<a>foo<b>thing</b></a>') 
>>> x.documentElement.childNodes[0] 
<DOM Text node "u'foo'"> 
>>> x.documentElement.childNodes[0].toxml() 
u'foo' 
>>> xml.dom.minidom.parseString(x.documentElement.childNodes[0].toxml()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/minidom.py", line 1928, in parseString 
    return expatbuilder.parseString(string) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py", line 940, in parseString 
return builder.parseString(string) 
    File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xml/dom/expatbuilder.py", line 223, in parseString 
parser.Parse(string, True) 
xml.parsers.expat.ExpatError: syntax error: line 1, column 0 

그 국외 거주자 (따라서 밖으로 상자 parseString의) 구문 분석됩니다.

내가 원하는 것은 u'foo '를 텍스트 노드로 구문 분석하는 것입니다. 나는. .toxml()의 효과를 되돌릴 수있는 내용

+0

'toxml()'이 잘못된 XML 조각을 어떻게 생성하는지 알지 못한다. 따라서'toxml()'에 의해 생성 된 모든 문자열은'parse()'또는'parseString())''xml.dom.minidom' 함수 ... –

+0

예를 들어 주셔서 감사합니다. 사실 텍스트 노드는 일반 텍스트로 렌더링됩니다.이 텍스트는 유효한 XML이 아닙니다. –

답변

2

저장해야하는 노드 유형은 무엇입니까?

분명히 요소 노드는 .toxml('utf-8')으로 직렬화되면 작동해야합니다. doctype에 정의가 필요한 EntityReferences가없는 한 결과는 XML 문서 그대로이며 요소는 documentElement에서 검색 가능해야합니다.

반면 텍스트 노드는 HTML 디코딩 또는 일부 구문 분석이 필요합니다.

var xml= node.toxml('utf-8') 

... 

if (xml.startswith('<')): 
    node= minidom.parseString(xml).documentElement 
else: 
    node= minidom.parseString('<x>%s</x>'%xml).documentElement.firstChild 

코멘트 노드가 유사 <!--를 확인하여 저장 될 수있다 : 당신은 단지 요소와 텍스트 노드를 필요한 경우 당신은 항상 요소에 대한 <을해야하기 때문에 그것이 첫 번째 문자에서 요소가 여부를 추측 할 수있다.

Attr과 같은 다른 노드 유형은 XML 표현이 텍스트와 쉽게 구별되지 않기 때문에 더 많은 작업이 필요합니다. 기억하기 위해서는 대역 외 nodeType 값을 저장해야합니다. OTOH minidom은 어쨌든 Attr에 toxml()을 구현하지 않으므로 문제가되지 않습니다.

+0

내가 저장하고있는 그 긁힌 데이터는 내가 만든 모든 가정에 대해 보수적 인 것이었지만 걱정할 필요가있는 요소와 텍스트 노드 만 될 가능성이 큽니다. Attr는 문제가되지 않지만 몇 가지 의견이있을 것입니다. 문자열을 받아 들일 수있는 쉬운 파서가 있다면 그것은 깔끔했을 것입니다. 그러나 형식의 대역 외 음표를 저장하는 것이 아마도 충분할 것입니다. 데이터베이스의 다른 열. 감사. –

3
from xml.dom.minidom import parseString 

try: 
    node = parseString('') 
except Exception: 
    node = None 
관련 문제