2015-10-19 43 views
0

我正在嘗試爲使用DOMDocuments的節點獲取XPath。但是,我收到的回覆是/*/*[2]/*/*[1]/*[1]/*[5]。任何人都知道這是爲什麼和/或可能的修復?getNodePath()未顯示元素

我的代碼:

$doc = new DOMDocument(); 
$doc->loadXML(file_get_contents($_FILES["xmlfile"]["tmp_name"])); 

$xp = new DOMXpath($doc); 
$domNodeList = $xp->evaluate("//*[@Name]") ; 
foreach($domNodeList as $domNodeListItem) 
{ 
    if(preg_match('/^rectangle.*/i',$domNodeListItem->getAttribute('Name')) === 1) 
    { 
     echo 'path: <pre>'.print_r($domNodeListItem->getNodePath(),true).'</pre>' ; 
    } 
} 

實施例XML(下面的例子中給出了我/*/*[1]/*/*[2]作爲輸出,預期是/Report/Rectangle/Report/MUAHAHA):

<?xml version="1.0" encoding="UTF-8"?> 
<Report xmlns="http://schemas.microsoft.com/sqlserver/reporting/2010/01/reportdefinition" xmlns:cl="http://schemas.microsoft.com/sqlserver/reporting/2010/01/componentdefinition" xmlns:rd="http://schemas.microsoft.com/SQLServer/reporting/reportdesigner"> 
    <Rectangle Name="Rectangle3"> 
     <ReportItems> 
      <Textbox Name="Textbox3"> 
       <CanGrow>true</CanGrow> 
       <KeepTogether>true</KeepTogether> 
       <Paragraphs> 
        <Paragraph> 
         <TextRuns> 
          <TextRun> 
           <Value /> 
           <Style /> 
          </TextRun> 
         </TextRuns> 
         <Style /> 
        </Paragraph> 
       </Paragraphs> 
       <rd:DefaultName>Textbox3</rd:DefaultName> 
       <Top>0.16667in</Top> 
       <Left>0.15625in</Left> 
       <Height>0.25in</Height> 
       <Width>1in</Width> 
       <Style> 
        <Border> 
         <Style>None</Style> 
        </Border> 
        <PaddingLeft>2pt</PaddingLeft> 
        <PaddingRight>2pt</PaddingRight> 
        <PaddingTop>2pt</PaddingTop> 
        <PaddingBottom>2pt</PaddingBottom> 
       </Style> 
      </Textbox> 
     </ReportItems> 
     <KeepTogether>true</KeepTogether> 
     <Top>0.66542in</Top> 
     <Left>2.53in</Left> 
     <Height>2.60417in</Height> 
     <Width>1.47917in</Width> 
     <ZIndex>3</ZIndex> 
     <Style> 
      <Border> 
       <Style>None</Style> 
      </Border> 
     </Style> 
    </Rectangle> 
    <MUAHAHA Name="Rectangle123"> 
     <ReportItems> 
      <Textbox Name="Textbox3"> 
       <CanGrow>true</CanGrow> 
       <KeepTogether>true</KeepTogether> 
       <Paragraphs> 
        <Paragraph> 
         <TextRuns> 
          <TextRun> 
           <Value /> 
           <Style /> 
          </TextRun> 
         </TextRuns> 
         <Style /> 
        </Paragraph> 
       </Paragraphs> 
       <rd:DefaultName>Textbox3</rd:DefaultName> 
       <Top>0.16667in</Top> 
       <Left>0.15625in</Left> 
       <Height>0.25in</Height> 
       <Width>1in</Width> 
       <Style> 
        <Border> 
         <Style>None</Style> 
        </Border> 
        <PaddingLeft>2pt</PaddingLeft> 
        <PaddingRight>2pt</PaddingRight> 
        <PaddingTop>2pt</PaddingTop> 
        <PaddingBottom>2pt</PaddingBottom> 
       </Style> 
      </Textbox> 
     </ReportItems> 
     <KeepTogether>true</KeepTogether> 
     <Top>0.66542in</Top> 
     <Left>2.53in</Left> 
     <Height>2.60417in</Height> 
     <Width>1.47917in</Width> 
     <ZIndex>3</ZIndex> 
     <Style> 
      <Border> 
       <Style>None</Style> 
      </Border> 
     </Style> 
    </MUAHAHA> 
</Report> 
+0

你期望什麼呢? – choroba

+0

我期望的路徑包含元素名稱,而不是通配符。 – dabuda

+0

你能提供一個小例子XML,所以我們可以重現這個問題嗎? – ThW

回答

0

找到答案。

返回的路徑是由於默認的命名空間。顯然,DOMDocuments和XPath都不像這個XML特性。

我使用的解決方法是刪除默認命名空間,獲取路徑,然後將其替換。我會在有空的時候添加一個例子。

給予默認命名空間一個前綴將是首選,但在我的情況下這是不可能的。