Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中使用根元素中的命名空间解析XML_Php_Xml_Namespaces_Simplexml - Fatal编程技术网

在PHP中使用根元素中的命名空间解析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文件:

<?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实例上注册名称空间。