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 @@
+
+
+
+
+