2015-10-19 3 views
0

Я пытаюсь получить XPath для узла с использованием DOMDocuments. Однако ответ, который я получаю, - /*/*[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.

Обходной путь, который я использовал, заключался в том, чтобы удалить пространство имен по умолчанию, получить путь, а затем заменить его. Я добавлю пример, когда у меня будет время.

Предоставление пространства имен по умолчанию префикс был бы предпочтительным, но это было невозможно в моем случае.

Смежные вопросы