2013-04-25 3 views
0

У меня такой xml, как указано ниже. Я пытаюсь получить значение для Cardnumber, используя следующее выражение.XPATH Ошибка: невозможно оценить выражение

XPATH:

paymentService/ns0:submit/ns0:order/ns0:paymentDetails/ns0:VISA-SSL/cardNumber 

Но это дает мне ошибку. Может ли кто-нибудь направить меня на это?

<?xml version="1.0" encoding="UTF-8"?> 
<paymentService version="1.0"> 
    <ns0:submit xmlns:ns0="http://www.tibco.com/ns/no_namespace_schema_location/Payment/PaymentProcessors/WorldPay_CC/SharedResources/Schemas/paymentService_v1.dtd"> 
     <ns0:order> 
      <description>description</description> 
      <amount value="500" currencyCode="EUR" exponent="2"/> 
      <ns0:paymentDetails> 
       <ns0:VISA-SSL> 
        <cardNumber>00009875083428500</cardNumber> 
        <expiryDate> 
         <date month="02" year="2008"/> 
        </expiryDate> 
        <cardHolderName>test</cardHolderName> 
       </ns0:VISA-SSL> 
       <session shopperIPAddress="192.165.22.35" id=""/> 
      </ns0:paymentDetails> 
      <shopper> 
       <browser> 
        <acceptHeader>text/html</acceptHeader> 
        <userAgentHeader>mozilla 5.0</userAgentHeader> 
       </browser> 
      </shopper> 
     </ns0:order> 
    </ns0:submit> 
</paymentService> 

Благодаря

+0

Если «выдает ошибку», то скажите нам, что ошибка! Сообщение может не иметь для вас никакого смысла, но есть хороший шанс, что кто-то здесь может это объяснить. –

ответ

0

Ваш xmlns:ns0 неуместна, и (думаю таким образом), потому что ns0 определяется после<ns0:submit> тега, ns0:submit является «неопределенным» и, таким образом, ошибка синтаксического анализа ,

Edit:

Если вам нужно использовать этот XPath в PHP, вы должны либо объявить пространство имен перед использованием:

<?xml version="1.0" encoding="UTF-8"?> 
<paymentService version="1.0" xmlns:ns0="http://www.tibco.com/ns/no_namespace_schema_location/Payment/PaymentProcessors/WorldPay_CC/SharedResources/Schemas/paymentService_v1.dtd"> 
    <ns0:submit> 

или зарегистрировать пространство имен перед оценкой вашего XPath (Спасибо @MiMo за указание):

$xml->registerXPathNamespace("ns0","http://www.tibco.com/ns/no_namespace_schema_location/Payment/PaymentProcessors/WorldPay_CC/SharedResources/Schemas/paymentService_v1.dtd"); 

добавить также косую черту перед вашим XPATH:

/paymentService/ns0:submit/ns0:order/ns0:paymentDetails/ns0:VISA-SSL/cardNumber 

Live demo with declaration first или Live demo with namespace registration (оба показаны в РНР).

+0

Определение пространства имен в первом элементе, который его использует, является законным в XML - XML ​​в OP действителен. – MiMo

+0

Неверная информация. –

0

Проблема является узлом

<paymentService version="1.0"> 

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

/ns0:submit/ns0:order/ns0:paymentDetails/ns0:VISA-SSL/cardNumber 
+0

Это проблема форматирования; OP не отделил свой код должным образом, поэтому SO «скрывает» закрывающий тег '. – Passerby

0

Вы должны зарегистрировать пространство имен перед вычислением XPath:

$xml->registerXPathNamespace('ns0', 'http://www.tibco.com/ns/no_namespace_schema_location/Payment/PaymentProcessors/WorldPay_CC/SharedResources/Schemas/paymentService_v1.dtd'); 

$xml где это SimpleXMLElement переменная, содержащая ваш XML.

Ваш XPath должен начать с / согласно прохожему ответ:

/paymentService/ns0:submit/ns0:order/ns0:paymentDetails/ns0:VISA-SSL/cardNumber 
+0

Вторая часть ответа неверна. Если элемент контекста для выражения XPath является узлом документа (root), то ведущий «/» является избыточным. –

+0

@MichaelKay: Я согласен, но я пробовал без косой черты, и это не работает. Контекст не является корнем документа - библиотека PHP XML кажется немного причудливой.Кроме того, управление пространством имен является странным: обычно вам нужно передавать пространства имен отдельно, чтобы использовать их в XPath, но с библиотекой PHP ЕСЛИ пространство имен объявлено в корневом элементе, которое может использоваться в XPath – MiMo

+0

@MichaelKay Не верно для реализации _some_ : http://3v4l.org/RZIQR http://3v4l.org/JtKca – Passerby