2014-09-13 1 views
0

Что я здесь прикручиваю?Python, XML-синтаксический анализ и Elementtree

Я не могу получить это, чтобы вернуть результаты. Я уверен, что делаю что-то глупое. Я не программист, и это сводит меня с ума. Попытка учиться, но примерно через 8 часов я измотался.

Вот пример моего XML:

<?xml version="1.0"?> 

-<MyObjectBuilder_Sector xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

<!-- Saved '2014-08-23T15:28:07.8585220-05:00' with SEToolbox version '1.44.14.2' --> 


-<Position> 

<X>0</X> 

<Y>0</Y> 

<Z>0</Z> 

</Position> 


-<SectorEvents> 


-<Events> 


-<MyObjectBuilder_GlobalEventBase> 


-<DefinitionId> 

<TypeId>MyObjectBuilder_GlobalEventDefinition</TypeId> 

<SubtypeId>SpawnCargoShip</SubtypeId> 

</DefinitionId> 

<Enabled>false</Enabled> 

<ActivationTimeMs>401522</ActivationTimeMs> 

</MyObjectBuilder_GlobalEventBase> 

</Events> 

</SectorEvents> 

<AppVersion>1044014</AppVersion> 


-<SectorObjects> 


-<MyObjectBuilder_EntityBase xsi:type="MyObjectBuilder_VoxelMap"> 

<EntityId>72248529206701361</EntityId> 

<PersistentFlags>CastShadows InScene</PersistentFlags> 


-<PositionAndOrientation> 

<Position z="-466" y="-8987" x="-95"/> 

<Forward z="-1" y="0" x="0"/> 

<Up z="0" y="1" x="0"/> 

</PositionAndOrientation> 

<Filename>BaseAsteroid.vox</Filename> 

</MyObjectBuilder_EntityBase> 


-<MyObjectBuilder_EntityBase xsi:type="MyObjectBuilder_VoxelMap"> 

<EntityId>72151252176979970</EntityId> 

<PersistentFlags>CastShadows InScene</PersistentFlags> 


-<PositionAndOrientation> 

<Position z="-11301.9033" y="-1183.70569" x="-2126.84"/> 

<Forward z="-1" y="0" x="0"/> 

<Up z="0" y="1" x="0"/> 

</PositionAndOrientation> 

<Filename>asteroid0.vox</Filename> 

</MyObjectBuilder_EntityBase> 


-<MyObjectBuilder_EntityBase xsi:type="MyObjectBuilder_VoxelMap"> 

<EntityId>72108197145016458</EntityId> 

<PersistentFlags>CastShadows InScene</PersistentFlags> 


-<PositionAndOrientation> 

<Position z="355.7873" y="18738.05" x="1064.912"/> 

<Forward z="-1" y="0" x="0"/> 

<Up z="0" y="1" x="0"/> 

</PositionAndOrientation> 

<Filename>asteroid1.vox</Filename> 

</MyObjectBuilder_EntityBase> 

Вот мой код, он просто никогда не находит ничего ... :(

from xml.etree import cElementTree as ElementTree 

    ElementTree.register_namespace('xsi', 'http://www.w3.org/2001/XMLScheme-instance') 
    namespace = {'xsi': 'http://www.w3.org/2001/XMLScheme-instance'} 

    xmlPath = 'e:\\test.xml' 
    xmlRoot = ElementTree.parse(xmlPath).getroot() 

    #why this no return anything 
    results = xmlRoot.findall(".//SectorObjects/MyObjectBuilder_EntityBase[@xsi:type='MyObjectBuilder_VoxelMap']", namespaces=namespace) 
    print(results) 
+0

Это недопустимый XML. Вы либо получите ошибку, либо корень, в котором ничего нет. Попробуйте вставить его в любой XML-валидатор онлайн, например [этот] (http://www.xmlvalidation.com/), и он вам это объяснит. – abarnert

+0

(И, конечно, пустое дерево ничего не вернет для любого 'findall'.) – abarnert

+0

Это всего лишь крошечная часть XML. Попытка загрузить его сейчас, около 5 МБ. Не удалось получить stackoverflow, чтобы не испортить его. Дерево не пусто. если я нахожусь для «.//SectorObjects/», я получаю много. – demolish50

ответ

0

Ваш вопрос: «Что я сначала нахожусь здесь? »Прежде всего, у вашего XML есть проблемы, и кажется, что вы не можете заставить его вставить здесь правильно. Я сделал несколько вещей, чтобы сделать его работоспособным.

1) Добавлены строки ниже, так как они не были там в XML:

</SectorObjects> 
</MyObjectBuilder_Sector> 

2) Функция FindAll не принимает именованный аргумент «пространств имен» и XSI часть также дала ошибку (SyntaxError: префикс «xsi» не найден в префиксной карте). Поэтому я изменил вызов:

results = xmlRoot.findall(".//SectorObjects/MyObjectBuilder_EntityBase") 

Когда я побежал код с выше изменений, я получил этот выход ниже:

[<Element 'MyObjectBuilder_EntityBase' at 0x025028A8>, <Element 'MyObjectBuilder_EntityBase' at 0x02502CC8>, <Element 'MyObjectBuilder_EntityBase' at 0x02502E18>] 

Если вы хотите сделать больше с этим, как получить значение EntityId , вы можете сделать это:

results = xmlRoot.findall(".//SectorObjects/MyObjectBuilder_EntityBase") 
try: 
    for result in results: 
     print result.find('EntityId').text 
except AttributeError as aE: 
    print str(aE) 

Выход:

72248529206701361 
72151252176979970 
72108197145016458