Анализировать XML-файл, который имеет только определения схемы - PullRequest
0 голосов
/ 28 октября 2019

У меня есть XML URI с несколькими определениями схемы. Выглядит это так

    <edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
    <edmx:DataServices>
    <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="ODataService">
    <EntityType Name="OpenHouse">
    <Key>
    <PropertyRef Name="OpenHouseKey"/>
    </Key>
    <Property Name="AppointmentRequiredYN" Type="Edm.Boolean">
    <Annotation Term="Core.Description" String="Indicates whether or not the OpenHouse requires an appointment."/>
    </Property>
    <Property Name="BridgeModificationTimestamp" Type="Edm.DateTimeOffset" Precision="27">
    <Annotation Term="Core.Description" String="A timestamp representing when last this listing was modified"/>
    </Property>
    <Property Name="ListingId" Type="Edm.String" MaxLength="255">...</Property>
    <Property Name="ListingKey" Type="Edm.String" MaxLength="255">...</Property>
    <Property Name="ListingKeyNumeric" Type="Edm.Int64">...</Property>
    <Property Name="ModificationTimestamp" Type="Edm.DateTimeOffset" Precision="27">
    <Annotation Term="Core.Description" String="The transactional timestamp automatically recorded by the MLS system representing the date/time the Open House was last modified."/>
    </Property>
    <Property Name="OpenHouseAttendedBy" Type="OpenHouseEnums.OpenHouseAttendedBy">
    <Annotation Term="Core.Description" String="Will the open house be attended by a licensed agent? Options are attended by agent, attended by the seller or unattended."/>
    </Property>.
.
.
.
</Schema>
</edmx:DataServices>
</edmx:Edmx>

Файл является ответом от API (с токеном аутентификации), поэтому я не могу опубликовать URL, а также слишком велик, чтобы разместить его здесь.

ТамЕсть несколько определений схемы http://prntscr.com/ppaynh

Я хочу проанализировать этот URI и для каждой схемы получить все EntityType с его свойствами и атрибутами. Я пытался использовать подобный код, но мой опыт работы с XML ограничен.

if (($response_xml_data = file_get_contents($url))===false){
    echo "Error fetching XML\n";
} else {
   libxml_use_internal_errors(true);
   $data = simplexml_load_string($response_xml_data);
   if (!$data) {
       echo "Error loading XML\n";
       foreach(libxml_get_errors() as $error) {
           echo "\t", $error->message;
       }
   } else {
      var_dump($data);
   }
} 

Как я могу получить этот XML в массив? Спасибо

1 Ответ

1 голос
/ 28 октября 2019

Поскольку XML включает пространство имен по умолчанию для данных схемы, вам нужно будет использовать его на каждом шаге для получения данных. Во-первых, чтобы использовать XPath для поиска элементов <Schema>, вам необходимо зарегистрировать это в документе. Затем позже, чтобы получить элементы в структуре, просто выберите дочерние объекты, используя пространство имен.

$schemaURI = "http://docs.oasis-open.org/odata/ns/edm";
$data->registerXPathNamespace("d", $schemaURI);
foreach ( $data->xpath("//d:Schema") as $schema)  {
    echo "Namespace=".$schema['Namespace'].PHP_EOL;
    $schemData = $schema->children($schemaURI);
    foreach ( $schemData->EntityType as $entityType )   {
        echo "Entity name=".$entityType->attributes()['Name'].PHP_EOL;
        $entityTypeData = $entityType->children($schemaURI);
        foreach ( $entityTypeData->Property as $propertyType )   {
            echo "Property name=".$propertyType->attributes()['Name'].PHP_EOL;
        }
    }
}

с тестовыми данными, это дает ...

Namespace=ODataService
Entity name=OpenHouse
Property name=AppointmentRequiredYN
Property name=BridgeModificationTimestamp
Property name=ListingId
Property name=ListingKey
Property name=ListingKeyNumeric
Property name=ModificationTimestamp
Property name=OpenHouseAttendedBy
...