2009-08-04 3 views
0

저는 STAF와 STAX에서 일하고 있습니다. 파이썬은 코딩에 사용됩니다. 나는 Python을 처음 사용한다. 기본적으로 내 작업은 문서 공장 파서를 사용하여 파이썬에서 XML 파일을 구문 분석하는 것입니다.XML 문서 작성 도구 팩토리를 사용하여 Python으로 구문 분석

내가 구문 분석하려고 XML 파일은 다음과 같습니다 나는 모든 태그를 읽을 필요가

<?xml version="1.0" encoding="utf-8"?> 
<operating_system> 
    <unix_80sp1> 
    <tests type="quick_sanity_test"> 
     <prerequisitescript>preparequicksanityscript</prerequisitescript> 
     <acbuildpath>acbuildpath</acbuildpath> 
     <testsuitscript>test quick sanity script</testsuitscript> 
     <testdir>quick sanity dir</testdir> 
    </tests> 
    <machine_name>u80sp1_L004</machine_name> 
    <machine_name>u80sp1_L005</machine_name> 
    <machine_name>xyz.pxy.dxe.cde</machine_name> 
    <vmware id="155.35.3.55">144.35.3.90</vmware> 
    <vmware id="155.35.3.56">144.35.3.91</vmware> 
    </unix_80sp1> 
</operating_system> 
  1. .
  2. 태그 machine_name에 대해 목록으로 읽어야합니다. 모든 컴퓨터 이름이 목록 machname에 있어야합니다. 태그를 읽은 후 machname은 [u80sp1_L004, u80sp1_L005, xyz.pxy.dxe.cde]이어야합니다.

  3. 나는 또한 모든 VM웨어 태그가 필요합니다 모든 속성 vmware_attr = [155.35.3.55,155.35.3.56] 모든 VM웨어 값이해야 vmware_value = [144.35.3.90,155.35.3.56]

되어야한다

vmware 태그와 컴퓨터 이름 태그를 제외한 모든 태그를 올바르게 읽을 수 있습니다. 다음 코드를 사용하고 있습니다. (저는 xml 및 VM웨어를 처음 사용합니다.) 도움이 필요합니다.

아래 코드를 수정해야합니다.

factory = DocumentBuilderFactory.newInstance(); 
factory.setValidating(1) 
factory.setIgnoringElementContentWhitespace(0) 
builder = factory.newDocumentBuilder() 
document = builder.parse(xmlFileName) 

vmware_value = None 
vmware_attr = None 
machname = None 

# Get the text value for the element with tag name "vmware" 
nodeList = document.getElementsByTagName("vmware") 
for i in range(nodeList.getLength()): 
node = nodeList.item(i) 
if node.getNodeType() == Node.ELEMENT_NODE: 
children = node.getChildNodes() 
for j in range(children.getLength()): 
thisChild = children.item(j) 
if (thisChild.getNodeType() == Node.TEXT_NODE): 
vmware_value = thisChild.getNodeValue() 
vmware_attr ==??? what method to use ? 
# Get the text value for the element with tag name "machine_name" 
nodeList = document.getElementsByTagName("machine_name") 
for i in range(nodeList.getLength()): 
node = nodeList.item(i) 
if node.getNodeType() == Node.ELEMENT_NODE: 
children = node.getChildNodes() 
for j in range(children.getLength()): 
thisChild = children.item(j) 
if (thisChild.getNodeType() == Node.TEXT_NODE): 
machname = thisChild.getNodeValue() 

태그가 있는지 여부를 확인하는 방법입니다. 구문 분석을 올바르게 코딩해야합니다. 그런 다음

vmware_value = [] 
vmware_attr = [] 
machname = [] 

목록에 항목을 추가 :

vmware_value = None 
vmware_attr = None 
machname = None 

이렇게 : 당신은

+0

저는 파이썬에서 간격이 중요하다는 것을 압니다. 그래서 코드 벽을 어떻게 포맷해야할지 모르겠습니다. 너는 그걸로 너 혼자 야. – Welbog

답변

0

그래서 대신의,하지 문자열로 목록과 같은 vmware_value, vmware_attr 및 machname를 인스턴스화 할 필요가 목록에서 append 메소드를 사용하십시오. 예컨대 :

factory = DocumentBuilderFactory.newInstance(); 
factory.setValidating(1) 
factory.setIgnoringElementContentWhitespace(0) 
builder = factory.newDocumentBuilder() 
document = builder.parse(xmlFileName) 

vmware_value = [] 
vmware_attr = [] 
machname = [] 

# Get the text value for the element with tag name "vmware" 
nodeList = document.getElementsByTagName("vmware") 
for i in range(nodeList.getLength()): 
    node = nodeList.item(i) 
    vmware_attr.append(node.attributes["id"].value) 
    if node.getNodeType() == Node.ELEMENT_NODE: 
     children = node.getChildNodes() 
     for j in range(children.getLength()): 
      thisChild = children.item(j) 
      if (thisChild.getNodeType() == Node.TEXT_NODE): 
       vmware_value.append(thisChild.getNodeValue()) 

나는 또한 내가 vmware_attr과 vmware_value 올바른 값을 추가하는 작업을해야한다고 생각 무언가에 코드를 수정했습니다.

STAX가 xml.dom 구문을 사용한다는 가정을해야했기 때문에 그렇지 않은 경우 내 제안을 적절하게 편집해야합니다.