문제

XML 파일을 Python으로 읽고 XML 파일에서 특정 요소를 꺼낸 다음 결과를 XML 파일로 다시 작성하려고합니다 (기본적으로 여러 요소가없는 원래 XML 파일입니다). .removechild (source)를 사용하면 제거하고 싶은 개별 요소를 제거하지만 반점에 공백을 남겨두면 파일을 매우 읽을 수 없습니다. 나는 여전히 모든 공백으로 파일을 구문 분석 할 수 있다는 것을 알고 있지만, 특정 요소의 속성의 값을 수동으로 변경 해야하는 경우가 있으며이를 수행하기가 어렵다 (및 Annyoing). 나는 확실히 손으로 공백을 제거 할 수 있지만 실제로는 실현 가능하지 않은 수십 개의 XML 파일이 있다면.

.removechild를 수행하고 공백도 제거 할 수있는 방법이 있습니까?

내 코드는 다음과 같습니다.

dom=parse(filename)
main=dom.childNodes[0]
sources = main.getElementsByTagName("source")
for source in sources :
    name=source.getAttribute("name")
    spatialModel=source.getElementsByTagName("spatialModel")
    val1=float(spatialModel[0].getElementsByTagName("parameter")[0].getAttribute("value"))
    val2=float(spatialModel[0].getElementsByTagName("parameter")[1].getAttribute("value"))
    if angsep(val1,val2,X,Y)>=ROI :
        main.removeChild(source)
    else:
        print name,val1,val2,angsep(val1,val2,X,Y)
f=open(outfile,"write")
f.write("<?xml version=\"1.0\" ?>\n")
f.write(dom.saveXML(main))
f.close()

도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책 2

xml.dom.minidom을 사용 하여이 작업을 수행하는 방법을 알 수 없었기 때문에 출력 파일에서 읽고 모든 빈 줄을 제거한 다음 새 파일로 다시 작성하는 빠른 기능을 작성했습니다.

f = open(xmlfile).readlines()
w = open('src_model.xml','w')
empty=re.compile('^$')
for line in open(xmlfile).readlines():
    if empty.match(line):
        continue
    else: 
        w.write(line)

이것은 나에게 충분히 잘 작동합니다 :)

다른 팁

pyxml이 설치된 경우 xml.dom.ext.prettyprint ()를 사용할 수 있습니다.

… ppl 검색 :

이 재미있는 스 니펫

skey = lambda x: getattr(x, "tagName", None)
mainnode.childNodes = sorted( 
  [n for n in mainnode.childNodes if n.nodeType != n.TEXT_NODE],
  cmp=lambda x, y: cmp(skey(y), skey(x)))

모든 텍스트 노드를 제거합니다 (또한 Tagname별로 리버스 정렬).

즉, 당신은 (재귀 적으로) 할 수 있습니다 tr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE] 모든 텍스트 노드를 제거합니다

아니면 같은 일을하고 싶을 수도 있습니다 … if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE) (일부 데이터가있는 텍스트 노드가 필요한 경우 직접 시도하지 않았습니다. 또는 특정 태그 내부에 텍스트를 남겨 두는 것이 더 복잡한 것.

이후 tree.toprettyxml(…) 잘 구성된 XML 텍스트를 반환합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top