홈>
XML 파일에 요소를 추가하고 있습니다.
문서의 루트는 다음과 같습니다
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
추가 할 요소는 다음과 같습니다
<Element xsi:type="some type">
<Sub1>Some text</Sub1>
<Sub2>More text</Sub2>
...
</Element>
Lxml이 내 Element의 복장 앞에 'xsi :'를 쓰는 방법을 찾으려고합니다. 이 xml 파일은 내가 액세스 할 수없는 소스 코드 인 프로그램에서 사용됩니다. 나는 XML 루트의 nsmap을 선언하여 그것을 시도하는 방법에 대한 몇 가지 다른 질문을 읽은 다음 다시 시도했지만 자식 속성에서 시도했지만 작동하지 않았습니다. 지금까지 가지고 있습니다 (작동하지 않는 출력 파일에는 xsi 접두사가 포함되어 있지 않습니다).
element = SubElement(_parent=parent,
_tag='some tag',
attrib={'{%s}type' % XSI: 'some type'}
nsmap={'xsi': XSI}) # Where XSI = namespace address
파싱 한 xml 파일에서 네임 스페이스가 올바르게 선언되었으므로 이것이 작동하지 않는 이유를 모르겠습니다. 내가 얻는 출력은 'xsi :'접두어가없는 위의 그림과 같은 요소입니다.
<Element type="some type"><Sub1>Some text</Sub1><Sub2>More text</Sub2>...</Element>
누군가도이 줄에서 이유를 지적 할 수 있다면
self.tree.write(self.filename, pretty_print=True, encoding='utf-8')
'pretty_print'옵션이 작동하지 않습니다 (모두 한 줄로 인쇄 됨). 대단히 감사하겠습니다.
내 스크립트의 코드 예는 다음과 같습니다.
from math import floor
from lxml import etree
from lxml.etree import SubElement
def Element(root, sub1: str):
if not isinstance(sub1, str):
raise TypeError
else:
element = SubElement(root, 'Element')
element_sub1 = SubElement(element, 'Sub1')
element_sub1.text = sub1
# ...
# Omitted additional SubElements
# ...
return element
def Sub(root, sub5_sub: str):
XSI = "http://www.w3.org/2001/XMLSchema-instance"
if not isinstance(sub5_sub, str):
raise TypeError
else:
sub = SubElement(root, 'Sub5_Sub', {'{%s}type' % XSI: 'SomeType'}, nsmap={'xsi': XSI})
# ...
# Omitted additional SubElements
# ...
return sub
class Generator:
def __init__(self) -> None:
self.filename = None
self.csv_filename = None
self.csv_content = []
self.tree = None
self.root = None
self.panel = None
self.panels = None
def mainloop(self) -> None:
"""App's mainloop"""
while True:
# Getting files from user
xml_filename = input('Enter path to xml file : ')
# Parsing files
csv_content = [{'field1': 'ElementSub1', 'field2': 'something'},
{'field1': 'ElementSub1', 'field2': 'something'},
{'field1': 'ElementSub2', 'field2': 'something'}] # Replaces csv file that I use
tree = etree.parse(xml_filename)
root = tree.getroot()
elements = root.find('Elements')
for element in elements:
if element.find('Sub1').text in ['ElementSub1', 'ElementSub2']:
for line in csv_content:
if element.find('Sub5') is not None:
Sub(root=element.find('Sub5'),
sub5_sub=line['field2'])
tree.write(xml_filename, pretty_print=True, encoding='utf-8')
if input('Continue? (Y) Quit (n)').upper().startswith('Y'):
elements.clear()
continue
else:
break
@staticmethod
def get_x(x: int) -> str:
if not isinstance(x, int):
x = int(x)
return str(int(floor(9999 / 9 * x)))
@staticmethod
def get_y(y: int) -> str:
if not isinstance(y, int):
y = int(y)
return str(int(floor(999 / 9 * y)))
def quit(self) -> None:
quit()
if __name__ == "__main__":
app = Generator()
app.mainloop()
app.quit()
출력 내용은 다음과 같습니다.
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Elements>
<Element>
<Sub1>ElementSub1</Sub1>
<Sub5>
<Sub5_Sub xsi:type="SomeType"/>
<Sub5_Sub xsi:type="SomeType"/><Sub5_Sub xsi:type="SomeType"/><Sub5_Sub xsi:type="SomeType"/></Sub5>
</Element>
<Element>
<Sub1>ElementSub1</Sub1>
<Sub5>
<Sub5_Sub xsi:type="SomeType"/>
<Sub5_Sub xsi:type="SomeType"/>
<Sub5_Sub xsi:type="SomeType"/><Sub5_Sub xsi:type="SomeType"/><Sub5_Sub xsi:type="SomeType"/></Sub5>
</Element>
<Element>
<Sub1>ElementSub1</Sub1>
</Element>
</Elements>
</Root>
어떤 이유로이 코드는 원하는 것을 수행하지만 실제 코드는 그렇지 않습니다. type 속성을 사용하여 일부 하위 요소에 접두사를 붙이지 만 접두사를 붙인 접두사에는 항상 'xsi :'가 아니라는 것을 알게되었습니다. 이상적이지 않은이 문제를 해결하는 빠르고 더러운 방법을 찾았습니다 (xsi-type의 파일을 찾아 lxml의 api에서 xsi : type으로 수락). 여전히 작동하지 않는 것은 pretty_print 매개 변수가 true 임에도 불구하고 모두 한 줄로 인쇄된다는 것입니다.
-
답변 # 1
관련 자료
- XML 구문 분석 Python (3 개의 태그와 1 개의 속성을 지정해야하는 경우)
- opc ua Python으로 값 쓰기
- hex - 파이썬을 사용하여 처음부터 미디 파일을 작성하는 방법
- classA에는 Python에서 속성`camera` 오류가 없습니다
- Python에서 txt 파일의 객체 속성을 작성하는 방법
- Python - 파이썬 - 중첩 사전에 대한 패턴을 어떻게 작성합니까?
- list - csv를 사용하여 파이썬으로 연락처 쓰기
- postgresql - Python으로 Postgres에 현재 날짜를 쓰는 방법은 무엇입니까?
- 파이썬에서 한 줄로 솔루션을 작성하는 방법은 무엇입니까?
- string - 날짜 목록, python - [attributeerror : 'list'object has no attribute 'strftime']
- 이 파이썬 코드를 작성하는 더 효율적인 방법은 무엇입니까? (7 개의 중첩 루프 코드는 시간이 너무 오래 걸립니다)
- oop - 클래스의 속성 오류 - 파이썬 :pycharm에서
- 코드를 짧게 만들려면 어떻게해야합니까? 그리고 이것이 코드를 작성하는 올바른 방법입니까? 파이썬에서
- python - attributeerror - 'tuple'개체에 '쓰기'속성이 없습니다 오류
- django - 인덱스가없는 쿼리 세트를 사용하여 Python에서 If 문을 작성하는 가장 좋은 방법은 무엇입니까?
- Selenium 및 Python을 사용하여 요소의 href 속성을 가져 오는 방법
- web scraping - python 웹 스크래핑 - 입력 태그에서 값 속성의 문자열을 어떻게 가져올 수 있습니까?
- Python 코드 (discordpy)에 Github에서 가져온 폴더의 이름을 작성하는 방법은 무엇입니까?
- pandas - 파이썬 - 바이너리 모드에서 파일 openend에 텍스트 모드로 쓰기
- class - 파이썬에서 다른 속성을 가진 속성을 정의하는 방법이 있습니까?
최근에이 시나리오가 발생하여
xsi:
를 사용하여 속성을 성공적으로 만들 수있었습니다.이것은 다음과 같은 것을 출력합니다