Надежно разобрать тег документации с любого WSDL - PullRequest
0 голосов
/ 26 ноября 2018

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

<portType name="ndfdXMLPortType">
<operation name="NDFDgen">
<documentation>My Documentation... lorem ipsum dolor sit amet</documentation>
<input message="tns:NDFDgenRequest" />
<output message="tns:NDFDgenResponse" />
</operation>
</portType>

Используя этот код

  $documentations = $styles = $outputs = array();
  if (!empty($array)) {
    foreach ($array['portType']['operation'] as $operation) {
      $documentations[$operation['@attributes']['name']] = $operation['documentation'];
    }
    foreach ($array['binding']['operation'] as $key => $operation) {
      $styles[$operation['@attributes']['name']] = $operation['operation']['@attributes']['style'];
      $outputs[$operation['@attributes']['name']] = $xml->binding->operation[$key]->output->body->asXML();
    }
  }

Но мне нужно проанализировать его из любого файла WSDL.Например, в другом WSDL это выглядит как.

<xs:sequence>
<xs:element name="BillingPeriod" type="ebl:BillingPeriodType" minOccurs="0" maxOccurs="1">
<xs:annotation>
<xs:documentation> Installment Period.
<br />
<b>Optional</b>
<br />
</xs:documentation>
</xs:annotation>
</xs:element>

1 Ответ

0 голосов
/ 26 ноября 2018

На самом деле это выглядит как два разных элемента.Первый documentation будет в пространстве имен WSDL (http://schemas.xmlsoap.org/wsdl/).Ваш второй пример, кажется, схема (http://www.w3.org/2001/XMLSchema).

В ваших примерах не хватает определений пространства имен.Ищите атрибуты xmlns и xmlns:xs.Следующие 3 примера могут быть прочитаны как {http://schemas.xmlsoap.org/wsdl/}documentation.

Анализатор XML разрешит определения пространства имен.Вы можете иметь такое же локальное имя для узла.В зависимости от префиксов и определений пространства имен они могут представлять разные вещи.

Кажется, вы используете SimpleXML и преобразуете его в массив.Не делай этого преобразования.SimpleXML позволяет вам уже использовать синтаксис PHP для доступа к XML.Но у объектов SimpleXMLElement все еще есть методы, облегчающие доступ.Вы потеряете это и информацию, если преобразуете выходные данные отладки в массив.

SimpleXMLElement позволяет использовать Xpath для извлечения узлов:

$element = new SimpleXMLElement($xml);
// register your own prefixes for the namespaces
$element->registerXPathNamespace('xsd', 'http://www.w3.org/2001/XMLSchema');
$element->registerXpathNamespace('wsdl', 'http://schemas.xmlsoap.org/wsdl/');

// fetch the documentation elements from both namespaces
$expression = '//xsd:documentation|//wsdl:documentation';
var_dump(
    (string)$element->xpath($expression)[0]
);    

Или в DOM:

$document = new \DOMDocument();
$document->loadXML($xml);
$xpath = new \DOMXpath($document);
// register your own prefixes for the namespaces
$xpath->registerNamespace('xsd', 'http://www.w3.org/2001/XMLSchema');
$xpath->registerNamespace('wsdl', 'http://schemas.xmlsoap.org/wsdl/');

// fetch the documentation elements from both namespaces and 
// cast the first into a string
$expression = 'string(//xsd:documentation|//wsdl:documentation)';
var_dump(
    $xpath->evaluate($expression)
);
...