【问题标题】:Parsing XML using Python on SelectSingleNode在 SelectSingleNode 上使用 Python 解析 XML
【发布时间】:2017-10-23 17:25:50
【问题描述】:

使用以下 XML 数据,我想获取我通过 python 代码调用的相关键的值。我想在不使用任何第三方库的情况下完成这项任务。

<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="john@abc.com" />
     <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 调用上相关键的值。提前致谢。

【问题讨论】:

    标签: python xml xpath ironpython


    【解决方案1】:

    我不太确定 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="john@abc.com" />
            <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')
    

    【讨论】:

    【解决方案2】:

    目前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))
    

    【讨论】:

    • 实际的 XML 是否有命名空间,特别是默认命名空间?
    猜你喜欢
    • 1970-01-01
    • 2021-02-06
    • 2017-08-31
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多