我正在尝试读取一个大型xml文件(大约40 MB),并使用此数据更新我的应用程序的数据库。
似乎我已经在使用XMLReader和simplexml_import_dom()的已用时间/内存方面找到了一个很好的折衷方案,但我无法在名称中获得带冒号的属性值...例如<g:attr_name>
如果我只是为每个“产品”节点使用$ reader-&gt; read()函数,我可以将值作为$ reader-&gt;值进行检索,但是如果我展开()节点并用$ doc-复制它&gt; importNode忽略此属性。
$reader = new XMLReader();
$reader->open(__XML_FILE__);
$doc = new DOMDocument;
while ($reader->read()) {
switch ($reader->nodeType) {
case (XMLREADER::ELEMENT):
if($reader->localName=="product"){
$node = simplexml_import_dom($doc->importNode($reader->expand(), true));
echo $node->attr_name."<br><br>";
$reader->next('product');
}
}
}
可能我会想念一些事情......任何建议都会非常贴切!
感谢。
答案 0 :(得分:6)
名称中冒号的属性为namespace。
冒号前面的部分是一个注册到某个命名空间的前缀(通常在根节点中)。要访问SimpleXmlElement
的命名空间属性,您必须将命名空间传递给attributes()
方法:
$attributes = $element->attributes('some-namespace'); // or
$attributes = $element->attributes('g', TRUE); // and then
echo $attributes['name'];
这同样适用于节点的元素子节点。通过childrens()
方法
$children = $element->children('some-namespace'); // or
$children = $element->children('g', TRUE); // and then
echo $children->elementName;
在旁注中,如果要将此数据导入数据库,您也可以尝试直接执行此操作: