2017-05-23 8 views
1

次のXMLデータを使用して、私がPythonコードを呼び出している関連するキーの値を取得します。そして、私はサードパーティ製のライブラリを使用せずにこの作業を達成したいと思います。SelectSingleNodeでPythonを使用してXMLを解析する

<Userinfo> 
    <UserData> 
    <item key="DateOfBirth" value="19851103" /> 
    <item key="FirstName" value="John" /> 
    <item key="LastName" value="Dicaprio" /> 
    <item key="Gender" value="M" /> 
    <item key="Email" value="[email protected]" /> 
    <item key="ContactNo" value="235625341" /> 
    </UserData> 
</Userinfo> 

上記のxmlコードから、私は以下のPythonコード内で呼び出すキーから値を抽出したいと思います。

def ExtractXml(args): 
url = '....' 
wc = System.Net.WebClient() 
xml = wc.DownloadString(url) 
doc = System.Xml.XmlDocument() 
doc.LoadXml(xml) 
root = doc.DocumentElement 
nsmgr = System.Xml.XmlNamespaceManager(doc.NameTable) 
#nsmgr.AddNamespace('ns','http://schemas.microsoft.com/developer/msbuild/2003') 
node = root.SelectNodes('/Userinfo/UserData',nsmgr) 
tcount=root.SelectNodes('/Userinfo/UserData').Count 

if not node: 
    ServiceDesk.Log.PrintError('No condition node') 
    return 

r=[] 
t={} 

counts=0 
for itemNode in node: 
    counts += 1 
    fullname = xstr(itemNode.SelectSingleNode("/item[@key='FirstName']/@value",nsmgr)) 
    empname = xstr(itemNode.SelectSingleNode("/item[@key='LastName']/@value",nsmgr)) 
    cardcountry = xstr(itemNode.SelectSingleNode("/item[@key='Email']/@value",nsmgr)) 
    #birthdate = ServiceDesk.Common.ParseDateTime(itemNode.SelectSingleNode("item[@key='DateOfBirth']")) 

    t = {'counter':counts,'FirstName':fullname,'LastName':empname,'Email':cardcountry,'__rowid__':counter,'__totalcount__':tcount} 
    r.append(t) 
return r 

次のコードを使用して、SelectSingleNode呼び出しで関連するキーの値を取得しません。前もって感謝します。

答えて

0

IronPythonについてはあまりよく分かりませんが、Pythonのコアライブラリにはプラットフォームに依存しないXMLパーサーがいくつか含まれています... xml.etree.ElementTreeを使用する例です。それは/を始めて以来、

import datetime 
import xml.etree.ElementTree as ET 

xml = '''<Userinfo> 
    <UserData> 
     <item key="DateOfBirth" value="19851103" /> 
     <item key="FirstName" value="John" /> 
     <item key="LastName" value="Dicaprio" /> 
     <item key="Gender" value="M" /> 
     <item key="Email" value="[email protected]" /> 
     <item key="ContactNo" value="235625341" /> 
    </UserData> 
</Userinfo>''' 

root = ET.fromstring(xml) 
fname = root.findall(".//item[@key='FirstName']")[0].get('value') 
dob = datetime.datetime.strptime(
     root.findall(".//item[@key='DateOfBirth']")[0].get('value'), 
     '%Y%m%d') 
+0

のElementTreeライブラリは、こので動作しません..:/ – Zoom1992

+0

投稿する前に、ElementTreeがIronPythonに含まれているかどうかを確認しました(https://ironpython-test.readthedocs.io/en/latest/library/xml.etree.elementtree.html)。それはなぜここで働かないのですか? – Tomatohater

+0

'LightException'オブジェクトに 'etree'という属性がありません。 – Zoom1992

0

は現在forループ内のXPath式は、すべてのドキュメントノードを基準にしています。この場合にはitemNodeによって参照されるコンテキスト要素にそれは相対的にするには、前述の.を追加するか、または単に完全に/を削除:

for itemNode in node: 
    counts += 1 
    # here are some ways to make your XPath heeds the context element `itemNode` 
    fullname = xstr(itemNode.SelectSingleNode("./item[@key='FirstName']/@value",nsmgr)) 
    empname = xstr(itemNode.SelectSingleNode("item[@key='LastName']/@value",nsmgr)) 
    cardcountry = xstr(itemNode.SelectSingleNode("self::*/item[@key='Email']/@value",nsmgr)) 
+0

以下のいずれかの方法が動作しません。 – Zoom1992

+0

実際のXMLには名前空間、特に既定の名前空間がありますか? – har07

+0

いいえ – Zoom1992

関連する問題