繁体   English   中英

如何访问从外部XML接收到的'Dublin Core'名称空间中的信息?

[英]How can I access the infomation in the 'Dublin Core' namespace received from external XML?


在最后一天,我在PHP中进行了一些XML解析。 . 我使用外部服务通过XML向我提供有关基于ISBN的图书的搜索信息

现在,我的问题是,我使用必需的书籍信息进行XML解析的任何方法都不会显示,并且无法在Simple XML Element Object中使用(请参见此屏幕快照中代码的第二个“ echo”结果) )。 如果我首先将XML作为字符串提取,则该信息是可见且可访问的(请参见此屏幕快照中下面代码的第一个“ echo”结果)。 目标是能够分别根据其元素名称(dc:title,dc:creator,dc:publisher,dc:date等)访问有关书籍的信息。 在我当前的代码段中,这是不可能的,因为PHP会在执行“ foreach”循环时告诉我:“警告:main():节点不再存在”。

我已经看过几篇有关“简单XML元素对象”中命名空间问题的Stack Overflow帖子,但是我无法针对在那里遇到的问题调整那里提出的解决方案。
我希望有人可以帮助我,并为我提供解决方案,以便我可以访问XML的“ dc”命名空间中的信息。

到目前为止,这是我使用过的非常简短的PHP代码:

$request = file_get_contents("http://externalXML.com"); //URL was replaced
echo "<pre>"; print_r($request); echo "</pre>"; 
$xml = simplexml_load_string($request);
echo "<pre>"; print_r($xml); echo "</pre>"; 
foreach ($xml->records->record->recordData->dc->children() as $child) {
    echo "Inhalt: " . $child . "<br>";
}

这就是XML的内容(因为我一直在寻找唯一的ISBN(请参阅“查询”元素),因此只能有一个或一个结果,但是永远不会有更多结果):

<searchRetrieveResponse>
<version>1.1</version>
<numberOfRecords>1</numberOfRecords>
<records>
    <record>
    <recordSchema>oai_dc</recordSchema>
    <recordPacking>xml</recordPacking>
    <recordData>
        <dc>
            <dc:title>1968 : Worauf wir stolz sein dürfen / Gretchen Dutschke</dc:title>
            <dc:creator>Dutschke, Gretchen [Verfasser]</dc:creator>
            <dc:publisher>Hamburg : Sven Murmann Verlagsgesellschaft mbH</dc:publisher>
            <dc:date>2018</dc:date>
            <dc:language>ger</dc:language>
            <dc:identifier xsi:type="tel:URN">urn:nbn:de:101:1-201803147211</dc:identifier>
            <dc:identifier xsi:type="tel:URL">http://nbn-resolving.de/urn:nbn:de:101:1-201803147211</dc:identifier>
            <dc:identifier xsi:type="tel:ISBN">978-3-96196-007-1</dc:identifier>
            <dc:identifier xsi:type="tel:URL">http://d-nb.info/1154519600/34</dc:identifier>
            <dc:identifier xsi:type="tel:URL">https://www.kursbuch.online</dc:identifier>
            <dc:identifier xsi:type="dnb:IDN">1154519600</dc:identifier>
            <dc:subject>300 Sozialwissenschaften, Soziologie, Anthropologie</dc:subject>
            <dc:type>Online-Ressource</dc:type>
            <dc:relation>http://d-nb.info/1144647959</dc:relation>
        </dc>
    </recordData>
    <recordPosition>1</recordPosition>
    </record>
</records>
<nextRecordPosition>2</nextRecordPosition>
<echoedSearchRetrieveRequest>
<version>1.1</version>
<query>"9783961960071"</query>
<xQuery xsi:nil="true"/>
</echoedSearchRetrieveRequest>
</searchRetrieveResponse>

干杯,蒂莫

注意:如果缺少的声明只是问题中的错误,则应将其标记为Reference的重复-如何在SimpleXML中处理名称空间(带有冒号的标记和属性)?

如果XML实际上如问题中所示,则无效-没有名称空间前缀dcxsi声明。 如果检查PHP日志或打开display_errors ,则每次解析XML时都会看到数十条警告。

要解决此损坏的XML,可以将响应包装在定义根目录空间的额外根元素中,从而得到有效的XML。

// Define your namespace URIs somewhere, for reference
// Since you're faking them, they could be anything you like, but in case the XML
//  is fixed in future, you might as well use the values that were probably intended
define('XMLNS_DUBLIN_CORE', 'http://purl.org/dc/elements/1.1/');
define('XMLNS_XSD_INSTANCE', 'http://www.w3.org/2001/XMLSchema-instance');

// Add a wrapper with the missing namespace declarations around the whole document
$request = '<dummy xmlns:dc="' . XMLNS_DUBLIN_CORE . '" xmlns:xsi="' . XMLNS_XSD_INSTANCE . '">'
    . $request
    . "</dummy>";

// Parse the now-valid XML
$xml = simplexml_load_string($request);

// Pop the wrapper off to get the original root element
$xml = $xml->children()[0];

// Proceed as though the document had been defined properly
echo $xml->records->record->recordData->dc->children(XMLNS_DUBLIN_CORE)->title;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM