Php 从XML文件接收特定值

Php 从XML文件接收特定值,php,xml,simplexml,Php,Xml,Simplexml,我有以下XML片段: <?xml version="1.0" encoding="UTF-8"?> <searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/"> <version>1.1</version> <numberOfRecords>1</numberOfRecords> <records> <record&

我有以下XML片段:

<?xml version="1.0" encoding="UTF-8"?>
<searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/">
   <version>1.1</version>
   <numberOfRecords>1</numberOfRecords>
   <records>
      <record>
     <recordSchema>MARC21-xml</recordSchema>
     <recordPacking>xml</recordPacking>
     <recordData>
        <record xmlns="http://www.loc.gov/MARC21/slim" type="Authority">
           <leader>00000nz  a2200000nc 4500</leader>
           <controlfield tag="001">040432386</controlfield>
           <controlfield tag="003">DE-101</controlfield>
           <controlfield tag="005">20180124053847.0</controlfield>
           <controlfield tag="008">880701n||azznnbabn           | ana    |c</controlfield>
           <datafield tag="024" ind1="7" ind2=" ">
          <subfield code="a">http://d-nb.info/gnd/4043238-5</subfield>
          <subfield code="2">uri</subfield>
           </datafield>
           <datafield tag="035" ind1=" " ind2=" ">
          <subfield code="a">(DE-101)040432386</subfield>
           </datafield>
           <datafield tag="035" ind1=" " ind2=" ">
          <subfield code="a">(DE-588)4043238-5</subfield>
           </datafield>
           <datafield tag="035" ind1=" " ind2=" ">
          <subfield code="z">(DE-588c)4043238-5</subfield>
          <subfield code="9">v:zg</subfield>
           </datafield>
           <datafield tag="040" ind1=" " ind2=" ">
          <subfield code="a">DE-101</subfield>
          <subfield code="9">r:DE-101</subfield>
          <subfield code="b">ger</subfield>
          <subfield code="d">9999</subfield>
           </datafield>
           <datafield tag="042" ind1=" " ind2=" ">
          <subfield code="a">gnd1</subfield>
           </datafield>
           <datafield tag="065" ind1=" " ind2=" ">
          <subfield code="a">13.3</subfield>
          <subfield code="2">sswd</subfield>
           </datafield>
           <datafield tag="075" ind1=" " ind2=" ">
          <subfield code="b">s</subfield>
          <subfield code="2">gndgen</subfield>
           </datafield>
           <datafield tag="075" ind1=" " ind2=" ">
          <subfield code="b">saz</subfield>
          <subfield code="2">gndspec</subfield>
           </datafield>
           <datafield tag="079" ind1=" " ind2=" ">
          <subfield code="a">g</subfield>
          <subfield code="q">s</subfield>
          <subfield code="u">w</subfield>
          <subfield code="u">o</subfield>
          <subfield code="u">z</subfield>
           </datafield>
           <datafield tag="083" ind1="0" ind2="4">
          <subfield code="a">751.45</subfield>
          <subfield code="9">d:3</subfield>
          <subfield code="9">t:2007-01-01</subfield>
          <subfield code="2">22/ger</subfield>
           </datafield>
           <datafield tag="150" ind1=" " ind2=" ">
          <subfield code="a">Ölmalerei</subfield>
           </datafield>
           <datafield tag="450" ind1=" " ind2=" ">
          <subfield code="a">Ölgemälde</subfield>
           </datafield>
           <datafield tag="550" ind1=" " ind2=" ">
          <subfield code="0">(DE-101)040372200</subfield>
          <subfield code="0">(DE-588)4037220-0</subfield>
          <subfield code="0">http://d-nb.info/gnd/4037220-0</subfield>
          <subfield code="a">Malerei</subfield>
          <subfield code="4">obal</subfield>
          <subfield code="4">http://d-nb.info/standards/elementset/gnd#broaderTermGeneral</subfield>
          <subfield code="w">r</subfield>
          <subfield code="i">Oberbegriff allgemein</subfield>
           </datafield>
           <datafield tag="670" ind1=" " ind2=" ">
          <subfield code="a">M</subfield>
           </datafield>
           <datafield tag="677" ind1=" " ind2=" ">
          <subfield code="a">Wird i.d.R. nur verwendet, wenn die Maltechnik behandelt ist.</subfield>
           </datafield>
           <datafield tag="750" ind1=" " ind2="7">
          <subfield code="a">Peinture à l'huile</subfield>
          <subfield code="0">(FrPBN)FRBNF119329441</subfield>
          <subfield code="0">http://data.bnf.fr/11932944</subfield>
          <subfield code="2">ram</subfield>
          <subfield code="9">v:MACS-Mapping. Bitte keine Änderungen vornehmen.</subfield>
           </datafield>
           <datafield tag="913" ind1=" " ind2=" ">
          <subfield code="S">swd</subfield>
          <subfield code="i">s</subfield>
          <subfield code="a">Ölmalerei</subfield>
          <subfield code="0">(DE-588c)4043238-5</subfield>
           </datafield>
        </record>
     </recordData>
     <recordPosition>1</recordPosition>
      </record>
   </records>
   <nextRecordPosition>2</nextRecordPosition>
   <echoedSearchRetrieveRequest>
      <version>1.1</version>
      <query>WOE=4043238-5 and COD=s</query>
      <xQuery xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true" />
      <recordSchema>MARC21-xml</recordSchema>
   </echoedSearchRetrieveRequest>
   <extraResponseData>
      <accountOf xmlns="">Staatsbibliothek zu Berlin - Preußischer Kulturbesitz, bpk-Bildagentur</accountOf>
   </extraResponseData>
</searchRetrieveResponse>

我环顾四周,发现这可能与将其传递给字符串有关,但随后我在屏幕上什么也看不到。甚至不是
simplexmlement
对象


感谢您的帮助

SimpleXMLElement是一个类名,不是函数。尝试使用新的实例对其进行实例化:

$xml = new SimpleXMLElement($result);
或者改用simplexml\u load\u字符串

$xml = simplexml_load_string($result);
此外,所有的curl代码都让事情变得过于复杂。这也应该起作用:

// ALWAYS sanitize user-submitted data
// in this example everything except numbers and hyphens are removed
$id = preg_replace("/[^0-9-]/", "", $_POST["id"]);
$url = "https://services.dnb.de/sru/authorities?version=1.1&operation=searchRetrieve&query=WOE%3D$id%20and%20COD%3Ds&recordSchema=MARC21-xml";
$xml = new SimpleXMLElement($url, 0, true);

评论和其他答案涵盖了您没有获得任何输出的原因。这是因为缺少
new
关键字。这将向您展示如何获取结果对象并对其进行解析以获得所需的子字段。这只是转储子字段对象,但您可以从此处对其执行任何操作

$xmlObj = new SimpleXMLElement($xml);

foreach($xmlObj->records->record->recordData->record->datafield as $dfield)
{
    if((string)$dfield["tag"] == "150")
    {
        $subfield = $dfield->subfield;
        var_dump($subfield);
    }
}

首先,XML不是内容类型:text/html;其次,死亡的白色屏幕是一个错误。检查错误日志,并获得准确的错误消息。您是否确认
$result
是您期望的结果?@delboy1978uk我100%同意。但这并不意味着它是实际接收的内容。
simplexmlement
是一个类名,而不是一个函数。尝试用
new
来实例化它,或者改用
simplexml\u load\u string
来实例化它。我尝试了这两种方法。它们中没有一个起作用。当我删除“curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);”时,将显示XML文件的数据。但是,整个文件并不是所需的值,您根本不需要卷曲。
SimpleXMLElement
构造函数为您获取数据。@SIB您还没有编写任何代码来访问您的“期望值”-您希望它如何做其他事情?@iainn我尝试了几个小时,但没有得到正确的结果。这就是为什么我在这里问,并希望得到一些例子或解决方案。就是这样!!非常感谢Patrick QBoy,我希望我在半小时前就这么说。我走的路是对的,但我忽略了“recordData”字段。也谢谢你@miken32
$xmlObj = new SimpleXMLElement($xml);

foreach($xmlObj->records->record->recordData->record->datafield as $dfield)
{
    if((string)$dfield["tag"] == "150")
    {
        $subfield = $dfield->subfield;
        var_dump($subfield);
    }
}