파이썬 엘레멘스트리 모듈에서는: Xml 파일을 찾을 때 어떻게 무시하려면 [이름공간이 &quot find&quot &quot findall";; 방법을 사용하여 일치하는 요소.

I want to use 방법을 &quot findall"; 소스 일부 요소를 찾을 수 있는 xml 파일을 엘레멘스트리 모듈에서는.

그러나 xml 파일 (테스트리스메르) 는 소스 이름공간이. 내가 xml 파일로 일부가 잘라냅니다 예제:

<?xml version="1.0" encoding="iso-8859-1"?>
<XML_HEADER xmlns="http://www.test.com">
    <TYPE>Updates</TYPE>
    <DATE>9/26/2012 10:30:34 AM</DATE>
    <COPYRIGHT_NOTICE>All Rights Reserved.</COPYRIGHT_NOTICE>
    <LICENSE>newlicense.htm</LICENSE>
    <DEAL_LEVEL>
        <PAID_OFF>N</PAID_OFF>
        </DEAL_LEVEL>
</XML_HEADER>

샘플 파이썬 코드는 아래와 같습니다.

from xml.etree import ElementTree as ET
tree = ET.parse(r"test.xml")
el1 = tree.findall("DEAL_LEVEL/PAID_OFF") # Return None
el2 = tree.findall("{http://www.test.com}DEAL_LEVEL/{http://www.test.com}PAID_OFF") # Return <Element '{http://www.test.com}DEAL_LEVEL/PAID_OFF' at 0xb78b90>

Http://www.test.com}, {&quot 이름공간이 작동됨 수 있지만, 있어,, 아주 불편한 &quot it& # 39 를 앞에 추가하기에서는 이름공간이 각 태그이고,

어떻게 해야 합니까;; 방법을 사용할 때 무시하시겠습니까 이름공간이 &quot find&quot &quot findall"; 및 드릴링됩니다?

질문에 대한 의견 (2)

39 의 XML 문서 자체를 it& 대신 수정 후 주기표시 수정하십시오 분석할 수 있는 좋은 결과를 얻을 수 있습니다. 이렇게 여러 네임스페이스을 및 이름공간이 앨리어스를 처리할 수 있습니다.

from io import StringIO  # for Python 2 import from StringIO instead
import xml.etree.ElementTree as ET

# instead of ET.fromstring(xml)
it = ET.iterparse(StringIO(xml))
for _, el in it:
    prefix, has_namespace, postfix = el.tag.partition('}')
    if has_namespace:
        el.tag = postfix  # strip all namespaces
root = it.root

여기 이 논의를 바탕으로 하고 있다. http://bugs.python.org/issue18304

해설 (5)

만약 그 전에 # 39 의 속성이 분리하십시오 xmlns 를 xml 파싱 좁히어 won& 박스트롤의 이름공간이 각 태그에 진단트리 앞에 붙인 것이다.

import re

xmlstring = re.sub(' xmlns="[^"]+"', '', xmlstring, count=1)
해설 (3)

이 값은 지금까지 답을 명시 적으로 동일팔레트에 이름공간이 스크립트입니다. 일반 솔루션을 통해 보다 차라리 푸십시오 이름공간이 xml:

import re
def get_namespace(element):
  m = re.match('\{.*\}', element.tag)
  return m.group(0) if m else ''

및 사용 방법을 찾기 때문이다.

namespace = get_namespace(tree.getroot())
print tree.find('./{0}parent/{0}version'.format(namespace)).text
해설 (2)

39, s, s # 39 를 here& 확장명으로 nonagon& 오토메이티드, 이 역시 스트립 네임스페이스을 끄기도구 속성:

from StringIO import StringIO
import xml.etree.ElementTree as ET

# instead of ET.fromstring(xml)
it = ET.iterparse(StringIO(xml))
for _, el in it:
    if '}' in el.tag:
        el.tag = el.tag.split('}', 1)[1]  # strip all namespaces
    for at in el.attrib.keys(): # strip namespaces of attributes too
        if '}' in at:
            newat = at.split('}', 1)[1]
            el.attrib[newat] = el.attrib[at]
            del el.attrib[at]
root = it.root
해설 (0)

에 의해 오토메이티드 향상합니다 에릭스포드:

우리가 할 수 있는 랩 (wrap) 이 객체를 변경하지 않고 구문 분석 모드 전역으로라는 함께 지지하는 chunghwa.

from xml.parsers import expat

class DisableXmlNamespaces:
    def __enter__(self):
            self.oldcreate = expat.ParserCreate
            expat.ParserCreate = lambda encoding, sep: self.oldcreate(encoding, None)
    def __exit__(self, type, value, traceback):
            expat.ParserCreate = self.oldcreate

이 다음과 같이 사용될 수 있습니다

import xml.etree.ElementTree as ET
with DisableXmlNamespaces():
     tree = ET.parse("test.xml")

이 방법은 실행 코드를 변경할 수 없는 아름다움을 위해 위부의 연관해제된 블록. 에 의해 작성 후 이 됐지 내가 사용한 뒤 버전 이 역시 상태입니까 에릭스포드 오류가 발생하지 연관해제된 라이브러리를 사용하여 expat.

해설 (1)

뿐만 아니라 세련된 문자열이어야 chunghwa 서식을 사용할 수 있습니다.

ns='http://www.test.com'
el2 = tree.findall("{%s}DEAL_LEVEL/{%s}PAID_OFF" %(ns,ns))

, PAID_OFF re you& 경우에는 반드시 # 39 한 단계 진단트리에서 나타납니다.

el2 = tree.findall(".//{%s}PAID_OFF" % ns)
해설 (0)

'와' you 're 사용하는 경우,' 엘레멘스트리 you& # 39 셀레멘스트리 강요할 수 없는 Expat 무시하려면 이름공간이 파서크레이트 교체하십니까 처리하는 ' ()'.

from xml.parsers import expat
oldcreate = expat.ParserCreate
expat.ParserCreate = lambda encoding, sep: oldcreate(encoding, None)

'하지만' () 는 '' 엘레멘스트리 사용하려고 Expat 호출하여 파서크레이트 옵션도 없고, 무시할 수 있도록 제공하지 이름공간이 seperator 문자열이어야 위의 코드는 다른 전지전능하심이라 손상될 수 있지만 이 생길 수 있다고 경고했다.

해설 (4)

39 의 합칩니다 let& [nonagon& # 39 의 오토메이티드] (https://stackoverflow.com/a/25920989/4465708) 와 [mzjn& # 39 라는 질문에, 관련 질문] (https://stackoverflow.com/a/42372404/4465708):

def parse_xml(xml_path: Path) -> Tuple[ET.Element, Dict[str, str]]:
    xml_iter = ET.iterparse(xml_path, events=["start-ns"])
    xml_namespaces = dict(prefix_namespace_pair for _, prefix_namespace_pair in xml_iter)
    return xml_iter.root, xml_namespaces

이 기능을 사용하여 저희에게는힘과:

    • 모두 네임스페이스을 및 구문 트리 객체에는 afaq 반복자가 생성하시겠습니까 *.
  1. 딕트 네임스페이스을 얻기 위해 만들어진 반복자가 반복할 수 있음을 알 수 있습니다 나중에 찾기 () '또는' 각 '통과' [tpc. 의해 슈그스테드 호출하십시오 핀들 () iMom0] (https://stackoverflow.com/questions/13412496/python-elementtree-module-how-to-ignore-the-namespace-of-xml-files-to-locate-ma # comment18328039_13412496).

  2. 39 의 루트 요소를 객체에는 tree& 반품해야 구문 분석 및 네임스페이스을.

내 생각에 이것은 there& # 39 로 최고의 외곽진입 all around ',' s no 인컨텍스트 구문 분석 결과 조작 또는 소스 xlm 스믈스트리트레멘스트리 출력입니다 것이 있었다.

또한 i&; d # 39 와 같은 신용 [barny& # 39 의 오토메이티드] (https://stackoverflow.com/a/33997423/4465708) 를 제공하는 에센셀 이 퍼즐 조각 (구문 분석 할 수 있는 내려받습니다 스크립트루트 &solarisdvd 반복자가). 사실 그전까지는 트리별 두 번 내 지상 XML 응용 프로그램 (한 번 afaq 네임스페이스을, 두 번째 kingdome. seattle. 루트).

해설 (0)

하지만 나는 내가 늦지 않을 것 같다 '는' 이 좋은 솔루션이 레오서브 지정값이 않습니다.

그러나 윈도 3.x 버전, '' 스마라자파서스트릭스파트 재작성할 작동하지 않습니다.

'소스 코드' 는 주 목적으로 xml/etree/ElementTree.py com/go/lrvid4005_ps_kr 아래쪽에

# Import the C accelerators
try:
    # Element is going to be shadowed by the C implementation. We need to keep
    # the Python version of it accessible for some "creative" by external code
    # (see tests)
    _Element_Py = Element

    # Element, SubElement, ParseError, TreeBuilder, XMLParser
    from _elementtree import *
except ImportError:
    pass

이는 좀 슬프다.

이 솔루션은 값으로 해야 합니다.

import _elementtree
try:
    del _elementtree.XMLParser
except AttributeError:
    # in case deleted twice
    pass
else:
    from xml.parsers import expat  # NOQA: F811
    oldcreate = expat.ParserCreate
    expat.ParserCreate = lambda encoding, sep: oldcreate(encoding, None)

거친 파이썬 3.6tb.

'또는' 기술서임을 경우에 유용합니다 시도하시겠습니까 시도하시겠습니까 어디선가 두 번 등 일부 코드에 너회가 리로드하려면 임포트합니다 모듈에서는 확보하십시오 이상한 오류뿐만

  • 최대 반복이 깊이까지의 초과됨
  • 아트리부텔라로: XMLParser

아 정말 이 소스 코드는 브트와 트리 과도한.

해설 (0)