使用xml reader在php中获取xml文件

时间:2018-03-06 11:22:23

标签: php xml xmlreader

这是示例XML文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Catalog SYSTEM "http://store.yahoo.com/doc/dtd/Catalog.dtd">
<Catalog Store`enter code here`ID="yhst-69328165909994" StoreName="Inmod Modern Furniture" PublishTimestamp="1517733517">
  <Table ID="main-table-for-download">
    <TableField ID="name" Type="text"/>
    <TableField ID="sale-price" Type="numbers"/>
    <TableField ID="path" Type="text"/>
    <TableField ID="taxable" Type="yes-no"/>
    <TableField ID="ship-weight" Type="numbers"/>
    <TableField ID="price" Type="numbers"/>
    <TableField ID="orderable" Type="orderable"/>
    <TableField ID="code" Type="text"/>
  </Table>

我只想得到这个元素 在阅读该XML文件后。我需要检查该XML文件是否包含yahoo feed?

你也可以建议任何更好的选择。

我的尝试:

$reader = new XMLReader();
$reader->xml($myxmlfilecontent);
while ($reader->read()) {
    if ($reader->nodeType == XMLReader::ELEMENT) {
        while ($reader->read()) {
            if ($reader->nodeType == XMLReader::ELEMENT) {
                //array_push($nodeList, $reader->localName);
                if (stripos($xml, 'yahoo') !== false) {
                    echo 'yahoo read';die
                }else{
                    echo 'not yahoo read';die 
                }                   
            }
        }
    }        
}

基本上在这个例子中我在整个文件中搜索雅虎, 我不想在整个文件中搜索我只想获取doc type元素并搜索该字符串。

2 个答案:

答案 0 :(得分:1)

您可以将节点类型检查为DOC_TYPE节点,然后使用readOuterXml() ...

获取该节点的xml
$reader = new XMLReader();
$reader->xml($myxmlfilecontent);
while ($reader->read()) {
    if ($reader->nodeType == XMLReader::DOC_TYPE) {
        echo $reader->readOuterXml();
    }
}

此输出 -

<!DOCTYPE Catalog SYSTEM "http://store.yahoo.com/doc/dtd/Catalog.dtd">

答案 1 :(得分:0)

您可以使用DOMDocument代替XMLReader获取systemId

$doc = new DOMDocument();
$doc->load($myxmlfilecontent);
$systemId = $doc->doctype->systemId;
if (stripos($systemId, 'yahoo') !== false) {
    echo "yahoo read";
} else {
    echo "not yahoo read";
}

Demo