Синтаксический анализ XML в Python с использованием фабрики компоновщика документов - PullRequest
0 голосов
/ 04 августа 2009

Я работаю в STAF и STAX. Здесь Python используется для кодирования. Я новичок в Python. По сути, моя задача - проанализировать XML-файл в python с использованием анализатора Factory Factory.

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. Мне также нужны все теги vmware: все атрибуты должны быть vmware_attr = [155.35.3.55,155.35.3.56] все значения vmware должны быть vmware_value = [144.35.3.90,155.35.3.56]

Я могу правильно прочитать все теги, кроме тегов vmware и имен компьютеров: Я использую следующий код: (я новичок в XML и VMware). Требуется помощь.

Код ниже необходимо изменить.

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()

Также, как проверить, существует ли тег или нет вообще. Мне нужно правильно кодировать разбор.

1 Ответ

0 голосов
/ 05 августа 2009

Вам необходимо создать экземпляры vmware_value, vmware_attr и machname как списки, а не как строки, поэтому вместо этого:

vmware_value = None
vmware_attr = None
machname = None

сделать это:

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

Затем, чтобы добавить элементы в список, используйте метод append в ваших списках. E.g.:

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, поэтому, если это не так, вам придется соответствующим образом отредактировать мое предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...