Intereting Posts
JSON-перекрестная связь с файлом PHP и локальным файлом javascript Почему эта переменная POST отправляется через AJAX Null? (JQuery / PHP) Codeigniter 2 формируется на одной странице, проблема validation_errors запуск showdown.js serveride для преобразования Markdown в HTML (в PHP) redirect Правила доступа с Yii Отображение сообщения, когда набор результатов пуст Сортировка подкачки в Cakephp 3.x Есть ли способ использовать jQuery для отправки формы без сложного поля путем разбивки поля? Нужна помощь, игнорируя сертификат сервера при привязке к LDAP-серверу с помощью PHP Адрес в почтовом ящике не соответствует RFC 2822, 3.6.2. когда электронная почта находится в переменной Нужно ли объявлять массив PHP перед использованием? как реализовать ws-security 1.1 в php5 htaccess перенаправляет все, кроме одной страницы, из html в php WAMPServer Неустранимая ошибка: класс «Монго» не найден Каков тип этой строки? а: 1: {s: 2: «ан»;}

xPath не находит ничего, кроме *

Это начинает сильно раздражать меня. У меня есть этот код XML:

Обновлено с правильными пространствами имен

<?xml version="1.0" encoding="utf-8"?> <Infringement xsi:schemaLocation="http://www.movielabs.com/ACNS http://www.movielabs.com/ACNS/ACNS2v1.xsd" xmlns="http://www.movielabs.com/ACNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <Case> <ID>...</ID> <Status>Open</Status> </Case> <Complainant> <Entity>...</Entity> <Contact>...</Contact> <Address>...</Address> <Phone>...</Phone> <Email>...</Email> </Complainant> <Service_Provider> <Entity>...</Entity> <Address></Address> <Email>...</Email> </Service_Provider> <Source> <TimeStamp>...</TimeStamp> <IP_Address>...</IP_Address> <Port>...</Port> <DNS_Name></DNS_Name> <Type>...</Type> <UserName></UserName> <Number_Files>1</Number_Files> <Deja_Vu>No</Deja_Vu> </Source> <Content> <Item> <TimeStamp>...</TimeStamp> <Title>...</Title> <FileName>...</FileName> <FileSize>...</FileSize> <URL></URL> </Item> </Content> </Infringement> 

И этот код PHP:

 <?php $data = urldecode($_POST["xml"]); $newXML = simplexml_load_string($data); var_dump($newXML->xpath("//ID")); ?> 

Я сбросил только $ newXML и получил массу данных, но единственный xPath, который я запускал, возвращал что-либо, кроме пустого массива, был «*»,

Разве не «// ID» должен найти все ID-узлы в документе? Почему он не работает?

благодаря

Я сбросил только $ newXML и получил массу данных, но единственный xPath, который я запускал, возвращал что-либо, кроме пустого массива, был «*»,

Итак, что было возвращено из var_dump($newXML->xpath("*")); ? <Infringement> ?

Если проблема – пространство имен, попробуйте следующее:

 var_dump($newXML->xpath("//*[local-name() = 'ID']")); 

Это будет соответствовать любому элементу в документе, чье имя является «ID», независимо от пространства имен.

Мои вещи работают, если я заменю все «xmlns» на «ns»

Чего ждать? Вы уверены, что показали нам все связанные с xmlns атрибуты в документе?

Обновление: вопрос был отредактирован, чтобы показать, что XML действительно имеет объявление пространства имен по умолчанию. Это объясняет исходную проблему: ваше выражение XPath выбирает элементы идентификатора, которые не имеют пространства имен, но элементы в вашем документе находятся в пространстве имен ACNS movielabs, благодаря объявлению пространства имен по умолчанию.

Объявление xmlns="http://www.movielabs.com/ACNS" для элемента означает "этот элемент и все потомки, у которых нет префикса пространства имен (например, ID), находятся в пространстве имен, представленном URI пространства имен http : //www.movielabs.com/ACNS '. " (Если у промежуточного потомка есть другая декларация пространства имен по умолчанию, которая затеняет это.)

Поэтому используйте мой ответ local-name() выше, чтобы игнорировать пространства имен или использовать технику jasso для указания ACNS movielabs и использовать его как предполагалось.

Корневой элемент вашего XML-документа, похоже, имеет пространство имен по умолчанию с URI « http://www.movielabs.com/ACNS ». Это означает, что все элементы вашего документа принадлежат этому пространству имен. Проблема в том, что все выражения XPath, которые не имеют префикса пространства имен, ищут элементы, которые не принадлежат ни одному пространству имен. Для поиска элементов (или атрибутов …) из определенного пространства имен вам необходимо зарегистрировать URI пространства имен для некоторого префикса, а затем использовать этот префикс в выражении XPath.

В случае простого XML-кода PHP это делается примерно так

 $newXML = simplexml_load_string($data); $newXML->registerXPathNamespace('prefix', 'http://www.movielabs.com/ACNS'); var_dump($newXML->xpath("//prefix:ID")); 

prefix может быть практически любым текстом, но URI пространства имен должен точно соответствовать тому, который используется в вашем XML-документе.

используйте это для любого пространства имен:

 var_dump($newXML->xpath("//*:ID")); 

Я не хорошо разбираюсь в XML-интерфейсе PHP, но я подозреваю, что проблема заключается в пространствах имен. В зависимости от того, как работает этот метод xpath, он может искать идентификационные элементы с пустым пространством имен. Ваши идентификационные элементы наследуют пространство имен от корневого элемента.

У вас есть пространство имен xml, определенное в элементе документа (атрибут xmlns="http://www.movielabs.com/ACNS" ). Пространство имен – это URL http://www.movielabs.com/ACNS . Это должно быть глобально уникальной строкой (URN). Из-за этого URL-адреса часто используются. Вероятность того, что кто-то использует ваш домен для пространства имен, очень низок, и вы можете поместить некоторую документацию по URL-адресу.

Парсер XML решает пространства имен. Узел получает 4 свойства.

Для <Infringement xmlns="http://www.movielabs.com/ACNS"/> :

 $namespaceURI => http://www.movielabs.com/ACNS $localName => Infringement $prefix => $nodeName => Infringement 

Для <movie:Infringement xmlns:movie="http://www.movielabs.com/ACNS"/> :

 $namespaceURI => http://www.movielabs.com/ACNS $localName => Infringement $prefix => movie $nodeName => movie:Infringement 

$namespaceURI и $localName являются стабильными. Остальные два зависят от префикса. Префикс является псевдонимом для пространства имен. Пространство имен uri является длинным и сложным, это сделало бы XML намного сложнее читать для записи, если он используется для каждого элемента / атрибута. Но вы можете интерпретировать узлы элементов как:

 {http://www.movielabs.com/ACNS}:Infringement 

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

 <foo xmlns="urn:foo"><bar xmlns="urn:bar"/></foo> 

Xpath использует ту же концепцию с собственным резольвером. Вы регистрируете свои собственные префиксы для пространства имен. Поэтому не имеет значения, как префиксы используются в XML, только совпадение uri пространства имен должно совпадать.

В DOM вы делаете это на экземпляре DOMXPath:

 $dom = new DOMDocument(); $dom->loadXml($xml); $xpath = new DOMXpath($dom); $xpath->registerNamespace('movie', 'http://www.movielabs.com/ACNS'); var_dump( $xpath->evaluate('string(/movie:Infringement/movie:Case/movie:ID)') ); 

В SimpleXML вы можете зарегистрировать пространство имен в SimpleXMLElement.

 $element = simplexml_load_string($xml); $element->registerXpathNamespace('movie', 'http://www.movielabs.com/ACNS'); var_dump( (string)$element->xpath('/movie:Infringement/movie:Case/movie:ID')[0] ); 

СОВЕТ: пространство имен по умолчанию используется только для элементов, атрибуты находятся в «no / empty namespace», если у них нет префикса.