【问题标题】:Xpath Query to select element and its child based on attributes of both element and childXpath Query 根据元素和子元素的属性选择元素及其子元素
【发布时间】:2014-01-08 04:29:30
【问题描述】:

如何编写 xpath 以根据节点的属性和子节点(如果有)属性获取匹配节点

单个xml节点:

<Nokia_3220.gif jcr:primaryType="nt:file" jcr:uuid="90ff297d-7508-4cc8-8302-71b6e75fb8ba" 
                jcr:created="2014-01-03T04:51:24.377-08:00" jcr:createdBy="admin">
    <jcr:content jcr:primaryType="nt:unstructured" country="India" firstName="Supplier" 
                 jcr:data="FBAAOw==" jcr:lastModified="2014-01-03T18:21:11.216+05:30" 
                 jcr:mimeType="image/gif" lastName="Image1" phone="988-777-5551" 
                 state="WB" status="Active"/>
</Nokia_3220.gif>

jcr:uuid 和 state 以及 firstName 和 jcr:created 的 xpath 查询都类似于搜索吗?

我试过了:

string xpath = "//Nokia_3220.gif[contains(translate(@jcr:uuid, 
                                       'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                       'abcdefghijklmnopqrstuvwxyz'),
                                    '90ff297d-7508-4cc8-8302-71b6e75fb8ba')
                and contains(translate(@state, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',   
                                          'abcdefghijklmnopqrstuvwxyz'),'W')
                and contains(translate(@firstName, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',                       
                                    'abcdefghijklmnopqrstuvwxyz'),'pplie')]"
xmlnodelist list = objDoc.selectnodes(xpath,ns);

我的问题是我无法预测特定属性是属于节点本身还是属于其子节点。

如果确定包含该属性的元素的名称,如何编写xpath来获取节点而不考虑附加到节点或其子节点的属性?

【问题讨论】:

    标签: c# asp.net xml xpath


    【解决方案1】:

    请试一试:

    string xpath = @"//Nokia_3220.gif[
                      contains(translate((. | *)/@jcr:uuid, 
                                         'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                         'abcdefghijklmnopqrstuvwxyz'),
                               '90ff297d-7508-4cc8-8302-71b6e75fb8ba') and 
                      contains(translate((. | *)/@state, 
                                         'ABCDEFGHIJKLMNOPQRSTUVWXYZ',   
                                         'abcdefghijklmnopqrstuvwxyz'),
                               'w') and 
                      contains(translate((. | *)/@firstName,  
                                         'ABCDEFGHIJKLMNOPQRSTUVWXYZ',            
                                         'abcdefghijklmnopqrstuvwxyz'),
                               'pplie')]";
    

    请注意,这是假设被检查的属性不会在给定元素及其子元素中多次出现。这足以满足您的需求吗?

    这是一个允许您检查与某个值匹配的名称的版本:

    string xpath = @"//*
                     [contains(local-name(), '3220')]
                     [contains(translate((. | *)/@jcr:uuid, 
                                         'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 
                                         'abcdefghijklmnopqrstuvwxyz'),
                               '90ff297d-7508-4cc8-8302-71b6e75fb8ba') and 
                      contains(translate((. | *)/@state, 
                                         'ABCDEFGHIJKLMNOPQRSTUVWXYZ',   
                                         'abcdefghijklmnopqrstuvwxyz'),
                               'w') and 
                      contains(translate((. | *)/@firstName,  
                                         'ABCDEFGHIJKLMNOPQRSTUVWXYZ',            
                                         'abcdefghijklmnopqrstuvwxyz'),
                               'pplie')]";
    

    【讨论】:

    • 嘿 Rishe,感谢您的回答。是否也可以包含搜索元素名称?
    • 嘿 Rishe,感谢您的回答。是否也可以包含搜索元素名称?我的意思是 Root/*[contains(translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz '), '3220')[在元素及其子元素中搜索属性]。我的意思是,给出了元素的部分或全名,我需要类似这样的搜索,其中在匹配或包含元素名称的给定部分的元素中使用提供的属性值进行搜索,这样,只有与给定搜索条件,应该是结果集。
    • //Nokia_3220.gif[contains(translate((. | *)/@jcr:uuid,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'863a9') and contains(translate((. | *)/@jcr:mimeType,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'gif') 并包含(翻译((. | *)/@lastName,'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz'),'image')]
    • 是下xml节点的xpath,产生0个结果。
    • 这会产生 0 个结果,尽管确实存在一个如上所示的元素
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    相关资源
    最近更新 更多