I want to use 방법을 " 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}, {" 이름공간이 작동됨 수 있지만, 있어,, 아주 불편한 " it& # 39 를 앞에 추가하기에서는 이름공간이 각 태그이고,
어떻게 해야 합니까;; 방법을 사용할 때 무시하시겠습니까 이름공간이 " find" " findall"; 및 드릴링됩니다?
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
만약 그 전에 # 39 의 속성이 분리하십시오 xmlns 를 xml 파싱 좁히어 won& 박스트롤의 이름공간이 각 태그에 진단트리 앞에 붙인 것이다.
import re
xmlstring = re.sub(' xmlns="[^"]+"', '', xmlstring, count=1)
이 값은 지금까지 답을 명시 적으로 동일팔레트에 이름공간이 스크립트입니다. 일반 솔루션을 통해 보다 차라리 푸십시오 이름공간이 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
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
에 의해 오토메이티드 향상합니다 에릭스포드:
우리가 할 수 있는 랩 (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.
'와' you 're 사용하는 경우,' 엘레멘스트리 you& # 39 셀레멘스트리 강요할 수 없는 Expat 무시하려면 이름공간이 파서크레이트 교체하십니까 처리하는 ' ()'.
from xml.parsers import expat
oldcreate = expat.ParserCreate
expat.ParserCreate = lambda encoding, sep: oldcreate(encoding, None)
'하지만' () 는 '' 엘레멘스트리 사용하려고 Expat 호출하여 파서크레이트 옵션도 없고, 무시할 수 있도록 제공하지 이름공간이 seperator 문자열이어야 위의 코드는 다른 전지전능하심이라 손상될 수 있지만 이 생길 수 있다고 경고했다.
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
이 기능을 사용하여 저희에게는힘과:
딕트 네임스페이스을 얻기 위해 만들어진 반복자가 반복할 수 있음을 알 수 있습니다 나중에 찾기 () '또는' 각 '통과' [tpc. 의해 슈그스테드 호출하십시오 핀들 () iMom0] (https://stackoverflow.com/questions/13412496/python-elementtree-module-how-to-ignore-the-namespace-of-xml-files-to-locate-ma # comment18328039_13412496).
내 생각에 이것은 there& # 39 로 최고의 외곽진입 all around ',' s no 인컨텍스트 구문 분석 결과 조작 또는 소스 xlm 스믈스트리트레멘스트리 출력입니다 것이 있었다.
또한 i&; d # 39 와 같은 신용 [barny& # 39 의 오토메이티드] (https://stackoverflow.com/a/33997423/4465708) 를 제공하는 에센셀 이 퍼즐 조각 (구문 분석 할 수 있는 내려받습니다 스크립트루트 &solarisdvd 반복자가). 사실 그전까지는 트리별 두 번 내 지상 XML 응용 프로그램 (한 번 afaq 네임스페이스을, 두 번째 kingdome. seattle. 루트).
하지만 나는 내가 늦지 않을 것 같다 '는' 이 좋은 솔루션이 레오서브 지정값이 않습니다.
그러나 윈도 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.
'또는' 기술서임을 경우에 유용합니다 시도하시겠습니까 시도하시겠습니까 어디선가 두 번 등 일부 코드에 너회가 리로드하려면 임포트합니다 모듈에서는 확보하십시오 이상한 오류뿐만
아 정말 이 소스 코드는 브트와 트리 과도한.