2014-06-24 73 views
3

我想將XML模式定義的元素解析爲CSV文件以進行文檔和分析。我的XSD採用以下形式;使用Python將XML模式定義解析爲CSV

<xs:element name="ELEMENT"> 
<xs:complexType> 
    <xs:sequence> 
     <xs:element ref="element 1"/> 
     <xs:element ref="element 2"/> 
     <xs:element ref="element 3"/> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 

對於給定的元素名稱,我想創建一個包含元素1,元素2,元素3,等一個CSV

我已經試過了Python lxml的庫,但一直沒能訪問/過濾個別元素。

import xml.etree.ElementTree as ET 
tree = ET.parse('doc.xsd') 
root = tree.getroot() 
for child in root: 
    print child.tag, child.attrib 
+0

你想要那些元素作爲列或行嗎?順便說一句,上面的XML是不完整的,不是有效的XML。嘗試將其更新爲最小工作XSD文件。 –

+0

我會推薦你​​使用'lxml'。你必須安裝它,它需要一點時間,但是比你擁有非常強大的包,具有很好的xpath支持,模式驗證等。並且要跟進,去教程[lxml](http://lxml.de/)提供它會回答你所有的問題。 –

+0

一月,感謝您的快速回復。我在本地有完整,有效的XSD。這只是一個sn漏。我嘗試了lxml,但我陷入困境。使用lxml,你如何找到一個特定的元素?一旦你找到它,你如何訪問子元素?順便說一句,元素1,元素2,元素3的列表是足夠的。 – user265603

回答

1

以下代碼顯示瞭如何在元素名稱中搜索XSD。

from lxml import etree 
xsdstr = """ 
<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="ELEMENT"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="element 1"/> 
     <xs:element ref="element 2"/> 
     <xs:element ref="element 3"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
""" 

doc = etree.fromstring(xsdstr.strip()) 

namespaces = {"xs": "http://www.w3.org/2001/XMLSchema"} 

names = doc.xpath("//xs:element/@ref", namespaces=namespaces) 
print names 

運行它打印:

['element 1', 'element 2', 'element 3'] 

在情況下,你有更多複雜的模式,您可能需要針對更好的名字,這裏是可能的例子:

print "trying more precise targeting ------" 
names = doc.xpath("//xs:element[@name='ELEMENT']//xs:sequence/xs:element/@ref", namespaces=namespaces) 
print names 

我們情況下,結果是一樣的。

+0

謝謝一堆。這絕對讓我走上了正確的道路。我會投票,但我還沒有代表。再次感謝。 – user265603