diff --git a/src/Metadata/Extractor/ResourceExtractorTrait.php b/src/Metadata/Extractor/ResourceExtractorTrait.php index 871ea17dcc..997d868f8d 100644 --- a/src/Metadata/Extractor/ResourceExtractorTrait.php +++ b/src/Metadata/Extractor/ResourceExtractorTrait.php @@ -80,7 +80,7 @@ private function phpize(\SimpleXMLElement|array|null $resource, string $key, str private function buildArgs(\SimpleXMLElement $resource): ?array { - if (!isset($resource->args->arg)) { + if (!isset($resource->args)) { return null; } diff --git a/src/Metadata/Extractor/XmlResourceExtractor.php b/src/Metadata/Extractor/XmlResourceExtractor.php index bc382f2553..51b18071a8 100644 --- a/src/Metadata/Extractor/XmlResourceExtractor.php +++ b/src/Metadata/Extractor/XmlResourceExtractor.php @@ -509,8 +509,8 @@ private function buildLinks(\SimpleXMLElement $resource): ?array } $links = []; - foreach ($resource->links as $link) { - $links[] = new Link(rel: (string) $link->link->attributes()->rel, href: (string) $link->link->attributes()->href); + foreach ($resource->links->link as $link) { + $links[] = new Link(rel: (string) $link->attributes()->rel, href: (string) $link->attributes()->href); } return $links; @@ -526,8 +526,8 @@ private function buildHeaders(\SimpleXMLElement $resource): ?array } $headers = []; - foreach ($resource->headers as $header) { - $headers[(string) $header->header->attributes()->key] = (string) $header->header->attributes()->value; + foreach ($resource->headers->header as $header) { + $headers[(string) $header->attributes()->key] = (string) $header->attributes()->value; } return $headers; diff --git a/src/Metadata/Extractor/schema/resources.xsd b/src/Metadata/Extractor/schema/resources.xsd index 295dd49599..b5bb6d1fa9 100644 --- a/src/Metadata/Extractor/schema/resources.xsd +++ b/src/Metadata/Extractor/schema/resources.xsd @@ -23,6 +23,7 @@ + @@ -45,7 +46,7 @@ - + @@ -73,14 +74,14 @@ - + - - + + @@ -420,7 +421,7 @@ - + @@ -433,7 +434,7 @@ - + @@ -513,8 +514,8 @@ - - + + diff --git a/src/Metadata/Tests/Extractor/XmlExtractorTest.php b/src/Metadata/Tests/Extractor/XmlExtractorTest.php index 1c1e8545de..f245385294 100644 --- a/src/Metadata/Tests/Extractor/XmlExtractorTest.php +++ b/src/Metadata/Tests/Extractor/XmlExtractorTest.php @@ -478,6 +478,18 @@ public static function getInvalidPaths(): array ]; } + public function testLessStrictSchema(): void + { + $resource = (new XmlResourceExtractor([__DIR__.'/xml/less_strict_schema.xml']))->getResources()[Comment::class][0]; + + $this->assertFalse($resource['openapi']); + $this->assertSame(0, $resource['paginationItemsPerPage']); + $this->assertSame(['https://example.com/a', 'https://example.com/b'], array_map(static fn ($link) => $link->getHref(), $resource['links'])); + $this->assertSame(['X-A' => 'a', 'X-B' => 'b'], $resource['headers']); + $this->assertSame(-1, $resource['operations'][0]['priority']); + $this->assertSame([], $resource['graphQlOperations'][0]['args']); + } + /** * Tests issue #8175: two XML operations sharing an explicit name silently * dropped one another. The factory must reject the duplicate up front. diff --git a/src/Metadata/Tests/Extractor/xml/less_strict_schema.xml b/src/Metadata/Tests/Extractor/xml/less_strict_schema.xml new file mode 100644 index 0000000000..682e82ab31 --- /dev/null +++ b/src/Metadata/Tests/Extractor/xml/less_strict_schema.xml @@ -0,0 +1,25 @@ + + + + + + + + + +
+
+ + + + + + + + + + +