使用 PHP 中 RootElement 中的命名空间解析 XML
Parse XML with namespace in RootElement in PHP
我有以下带有命名空间的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<dc:languages xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:lang name="C">
<dc:appeared>1972</dc:appeared>
<dc:creator>Dennis Ritchie</dc:creator>
</dc:lang>
<dc:lang name="PHP">
<dc:appeared>1995</dc:appeared>
<dc:creator>Rasmus Lerdorf</dc:creator>
</dc:lang>
<dc:lang name="Java">
<dc:appeared>1995</dc:appeared>
<dc:creator>James Gosling</dc:creator>
</dc:lang>
</dc:languages>
我想读取 creator 值,但我的代码不起作用。
$languages = simplexml_load_string($myXMLData);
$ns = $languages->getNamespaces(true);
$parent = $languages->$ns["lang"];
foreach($parent as $lang) {
$dc = $lang->children($ns["dc"]);
echo $dc->creator.'<br>';
}
请帮帮我!
您不应使用 SimpleXMLElement::getNamespaces()
从文档中获取命名空间 URI。它们是定义值,而不是前缀。 Prefixes/Aliases 对于 XML 元素节点是可选的,并且可以在任何元素节点处更改。因此,只需为您正在使用的所有命名空间定义一个数组。
SimpleXMLElement::children()
就像一个过滤器和 returns 一个 SimpleXMLElement
。您可以使用 属性 语法来访问过滤后的子元素。
$languages = simplexml_load_string($xml);
$ns = [
'dc' => 'http://purl.org/dc/elements/1.1/'
];
$parent = $languages->children($ns["dc"])->lang;
foreach($parent as $lang) {
$creator = $lang->children($ns["dc"])->creator;
echo htmlspecialchars($creator).'<br>';
}
输出:
Dennis Ritchie<br>Rasmus Lerdorf<br>James Gosling<br>
在 DOM 中,您可以使用 Xpath(在注册名称空间后)获取值:
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('d', 'http://purl.org/dc/elements/1.1/');
foreach($xpath->evaluate('/d:languages/d:lang') as $lang) {
$creator = $xpath->evaluate('string(d:creator)', $lang);
echo htmlspecialchars($creator), '<br>';
}
尽管 ThW 的回答非常好,但这似乎也有效....
<?php
$xml= simplexml_load_string(
'<?xml version="1.0" encoding="utf-8"?>
<dc:languages version = "2" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:lang name="C">
<dc:appeared>1972</dc:appeared>
<dc:creator>Dennis Ritchie</dc:creator>
</dc:lang>
<dc:lang name="PHP">
<dc:appeared>1995</dc:appeared>
<dc:creator>Rasmus Lerdorf</dc:creator>
</dc:lang>
<dc:lang name="Java">
<dc:appeared>1995</dc:appeared>
<dc:creator>James Gosling</dc:creator>
</dc:lang>
</dc:languages>'
);
foreach($xml->xpath('//dc:lang') as $lang) {
echo $lang->xpath('dc:creator')[0]."<br>";
}
并从 CLI 生成此输出。
Dennis Ritchie<br>Rasmus Lerdorf<br>James Gosling<br>
但是我确实不得不稍微修改一下你的 XML 否则 simplexml_load_string() 会 return 错误。
<dc:languages xmlns:dc="http://purl.org/dc/elements/1.1/">
到
<dc:languages version = "2" xmlns:dc="http://purl.org/dc/elements/1.1/">
我有以下带有命名空间的 XML 文件:
<?xml version="1.0" encoding="utf-8"?>
<dc:languages xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:lang name="C">
<dc:appeared>1972</dc:appeared>
<dc:creator>Dennis Ritchie</dc:creator>
</dc:lang>
<dc:lang name="PHP">
<dc:appeared>1995</dc:appeared>
<dc:creator>Rasmus Lerdorf</dc:creator>
</dc:lang>
<dc:lang name="Java">
<dc:appeared>1995</dc:appeared>
<dc:creator>James Gosling</dc:creator>
</dc:lang>
</dc:languages>
我想读取 creator 值,但我的代码不起作用。
$languages = simplexml_load_string($myXMLData);
$ns = $languages->getNamespaces(true);
$parent = $languages->$ns["lang"];
foreach($parent as $lang) {
$dc = $lang->children($ns["dc"]);
echo $dc->creator.'<br>';
}
请帮帮我!
您不应使用 SimpleXMLElement::getNamespaces()
从文档中获取命名空间 URI。它们是定义值,而不是前缀。 Prefixes/Aliases 对于 XML 元素节点是可选的,并且可以在任何元素节点处更改。因此,只需为您正在使用的所有命名空间定义一个数组。
SimpleXMLElement::children()
就像一个过滤器和 returns 一个 SimpleXMLElement
。您可以使用 属性 语法来访问过滤后的子元素。
$languages = simplexml_load_string($xml);
$ns = [
'dc' => 'http://purl.org/dc/elements/1.1/'
];
$parent = $languages->children($ns["dc"])->lang;
foreach($parent as $lang) {
$creator = $lang->children($ns["dc"])->creator;
echo htmlspecialchars($creator).'<br>';
}
输出:
Dennis Ritchie<br>Rasmus Lerdorf<br>James Gosling<br>
在 DOM 中,您可以使用 Xpath(在注册名称空间后)获取值:
$document = new DOMDocument();
$document->loadXML($xml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('d', 'http://purl.org/dc/elements/1.1/');
foreach($xpath->evaluate('/d:languages/d:lang') as $lang) {
$creator = $xpath->evaluate('string(d:creator)', $lang);
echo htmlspecialchars($creator), '<br>';
}
尽管 ThW 的回答非常好,但这似乎也有效....
<?php
$xml= simplexml_load_string(
'<?xml version="1.0" encoding="utf-8"?>
<dc:languages version = "2" xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:lang name="C">
<dc:appeared>1972</dc:appeared>
<dc:creator>Dennis Ritchie</dc:creator>
</dc:lang>
<dc:lang name="PHP">
<dc:appeared>1995</dc:appeared>
<dc:creator>Rasmus Lerdorf</dc:creator>
</dc:lang>
<dc:lang name="Java">
<dc:appeared>1995</dc:appeared>
<dc:creator>James Gosling</dc:creator>
</dc:lang>
</dc:languages>'
);
foreach($xml->xpath('//dc:lang') as $lang) {
echo $lang->xpath('dc:creator')[0]."<br>";
}
并从 CLI 生成此输出。
Dennis Ritchie<br>Rasmus Lerdorf<br>James Gosling<br>
但是我确实不得不稍微修改一下你的 XML 否则 simplexml_load_string() 会 return 错误。
<dc:languages xmlns:dc="http://purl.org/dc/elements/1.1/">
到
<dc:languages version = "2" xmlns:dc="http://purl.org/dc/elements/1.1/">