2015-01-04 68 views
-3

我测试的XML结构:如何使用XPath检索subsubchild?

<Articles> 


... 


    <Article ID="333"> 

    <author>Paul</author> 

    <title>i hate xpath </title> 

     <child1>bla</child1> 

     <child2>blabla 
      <subchild> 
      <subsubchild DEEP = "Attribute"></subsubchild>  //this is my nightmare 
      </subchild> 
     </child2> 

     <child3>testing</child3> 

    </Article> 
... 

</Articles> 

什么XPath表达式将获取并更新subsubchild ATTRIB价值?如果父ID(本例中为333)是已知的,我主要关心的是获取和更新任何节点的子值,无论其位置有多深或多浅。

目前我使用:

$query= "//*[@ID=333]//*node()[@DEEP and @DEEP = "Attribute"]"; 
$outcome = $xml->xpath($query); 
    echo isset($outcome[0][0]) ? "found" : "unavailable"; 

和几个相关的表述是,他们都折腾我的无效表达报告工作。

function XMLChangeAttribValue($ParentID, $attirbName, $attribValue, $NewValue){ 
 
     
 
      $xml //Never mind, i've create this sucessfully 
 

 
    
 
      $query = "//*[@ID=$ParentID]//*[@$attirbName = $attribValue]"; 
 
        
 

 
      $outcome = $xml->xpath($query); 
 
      echo isset($outcome[0][0]) ? "found" : "unavailable"; 
 
}

+2

我不知道你的问题是什么。 “无效的表达式报告”是否意味着XPath引擎报告错误?然后,请显示它。你使用PHP吗?然后,标记问题。 XPath不是用于更新XML文档的正确工具,请将您的预期输出显示为XML。 – 2015-01-04 15:04:22

+3

避免个人言论 - 他们不完全帮助你的问题得到一个很好的答案。但是,处理我的意见将有所帮助。 – 2015-01-04 15:29:04

+0

很抱歉马蒂亚斯如果我imodest响起,我没有故意的,我是唯一在乌尔说的XPath supprised不能使用(或者说是不正确的工具)用于更新XML。有什么更好的?一个foreach循环?以及通过更新我的意思是我想改变DEEP(属性)的价值为我选择的东西。如果你有想法,请告诉我。再一次,接受我的同情。 – 2015-01-04 15:43:02

回答

2

的XPath来选择subsubchild你在这种情况下,目标是:

$query = "//*[@ID=333]//*[@DEEP = 'Attribute']"; 

要选择属性本身,你可以使用:

$query = "//*[@ID=333]//*/@DEEP[. = 'Attribute']"; 

请注意,我在钢琴中使用了单引号g,因为除非您转义它们,否则不能在双引号字符串中使用双引号。

还应当指出的是,在一个丛使用*node()一切都没有在XPath表达式中有效。

+0

谢谢@Rishe。但在实际意义上,我不知道节点“subsubchild”在编译时(或测试时间,如果你不介意)。这就是我使用xpath的node()函数的原因。我还有什么可以在运行时获取节点名称?再次,我实际上想要做一个选择所有的东西,如在“// * [@ ID = 333] // *(未知节点)...获取任何avilable匹配。提前致谢。 – 2015-01-04 17:31:57

+0

@OsagieOdigie在这种情况下该元素的名称是未知的,你可以使用'*'。请参阅上面的编辑。 – JLRishe 2015-01-04 17:45:03

+0

对不起,打扰你。上面的函数(我的新编辑)显示了什么试图模拟。得到无效的表达式,你看到的是什么d错误?thnks – 2015-01-04 18:12:17