2014-09-13 2 views
0

여기에 무슨 문제가 있습니까?Python, XML 구문 분석 및 Elementtree

결과를 반환 할 수 없습니다. 나는 바보 같은 짓을하고 있다고 확신한다. 나는 프로그래머가 아니에요. 그리고 이것은 나를 미치게합니다. 배우려고 노력하고있는 약 8 시간 이후 나는 frazzled하다. 여기

내 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입니다. 오류가 있거나 루트가없는 경우입니다. [this one] (http://www.xmlvalidation.com/)과 같은 온라인 XML 유효성 검사기에 붙여 넣으십시오. 그러면 해당 내용이 설명됩니다. – abarnert

+0

(그리고 물론 빈 나무는'findall'에 대해 아무것도 반환하지 않을 것입니다.) – abarnert

+0

그것은 XML의 일부분에 지나지 않습니다. 지금 업로드하려고하는데 약 5MB입니다. 그것을 망치지 stackoverflow 가져올 수 없습니다. 나무는 비어 있지 않습니다. ".//SectorObjects /"에 대해 알아 내면 충분히 얻을 수 있습니다. – demolish50

답변

0

무엇 나는 여기에 속이고 있습니까? "우선 XML 자체에 문제가 있으며 여기에 붙여 넣을 수없는 것으로 보입니다. 작동 가능하게 만드는 몇 가지 작업을 수행했습니다.

그들은 XML에 존재하지 않았다 때문에 아래

1) 추가 라인 :) 명명 된 인수 '네임 스페이스'와 XSI 부분을하지 않습니다 findall은 기능도 오류를 준

</SectorObjects> 
</MyObjectBuilder_Sector> 

2

(구문 에러 : 접두사 'xsi'는 접두사 맵에 없습니다). 그래서 난에 전화를 변경 : 내가 위에서 변화의 코드를 실행하면

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

, 나는 다음이 출력을 가지고 : 당신이 ENTITYID의 값을 받고처럼 많은 이들과 함께하고 싶은 경우

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

이 작업을 수행 할 수 있습니다

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