在PHP中使用根元素中的命名空间解析XML
我有以下带有命名空间的XML文件:在PHP中使用根元素中的命名空间解析XML,php,xml,namespaces,simplexml,Php,Xml,Namespaces,Simplexml,我有以下带有命名空间的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&
<?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>
1972
丹尼斯·里奇
1995
拉斯穆斯勒多夫
1995
詹姆斯·高斯林
我想读取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>';
}
$languages=simplexml\u load\u字符串($myXMLData);
$ns=$languages->getnamespace(true);
$parent=$languages->$ns[“lang”];
foreach($lang作为父对象){
$dc=$lang->children($ns[“dc”]);
echo$dc->creator.“
”;
}
请帮帮我 不应使用
SimpleXMLElement::getNamespaces()
从文档中获取命名空间URI。它们是定义值,而不是前缀。前缀/别名对于XML元素节点是可选的,可以在任何元素节点上更改。因此,只需为您正在使用的所有名称空间定义一个数组
simplexmlement::children()
的作用类似于一个过滤器并返回一个simplexmlement
。可以使用属性语法访问筛选的子元素
$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>';
}
$languages=simplexml\u load\u字符串($xml);
$ns=[
'dc'=>'http://purl.org/dc/elements/1.1/'
];
$parent=$languages->children($ns[“dc”])->lang;
foreach($lang作为父对象){
$creator=$lang->children($ns[“dc”])->creator;
回音htmlspecialchars($creator)。“
”;
}
输出:
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>';
}
$document=新的DOMDocument();
$document->loadXML($xml);
$xpath=newdomxpath($document);
$xpath->registerNamespace('d','http://purl.org/dc/elements/1.1/');
foreach($xpath->evaluate('/d:languages/d:lang')为$lang){
$creator=$xpath->evaluate('string(d:creator)',$lang);
echo htmlspecialchars($creator),“
”;
}
不应使用SimpleXMLElement::getNamespaces()
从文档中获取命名空间URI。它们是定义值,而不是前缀。前缀/别名对于XML元素节点是可选的,可以在任何元素节点上更改。因此,只需为您正在使用的所有名称空间定义一个数组
simplexmlement::children()
的作用类似于一个过滤器并返回一个simplexmlement
。可以使用属性语法访问筛选的子元素
$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>';
}
$languages=simplexml\u load\u字符串($xml);
$ns=[
'dc'=>'http://purl.org/dc/elements/1.1/'
];
$parent=$languages->children($ns[“dc”])->lang;
foreach($lang作为父对象){
$creator=$lang->children($ns[“dc”])->creator;
回音htmlspecialchars($creator)。“
”;
}
输出:
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>';
}
$document=新的DOMDocument();
$document->loadXML($xml);
$xpath=newdomxpath($document);
$xpath->registerNamespace('d','http://purl.org/dc/elements/1.1/');
foreach($xpath->evaluate('/d:languages/d:lang')为$lang){
$creator=$xpath->evaluate('string(d:creator)',$lang);
echo htmlspecialchars($creator),“
”;
}
尽管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>";
}
尽管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>";
}
我总是怀疑我的答案过于简单。我总是怀疑我的答案过于简单。LibXML有一个坏的功能,它注册当前上下文的命名空间定义。您可以将Xpath与SimpleXML一起使用,但应该在每个调用方法Xpath()
on的SimpleXMLElement实例上注册名称空间。LibXML具有注册当前上下文的名称空间定义的中断功能。可以将Xpath与SimpleXML一起使用,但应该在调用方法Xpath()
的每个SimpleXMLElement实例上注册名称空间。