php使用xsd架构读取xml数据

时间:2014-06-05 13:31:12

标签: php xml xsd

几个小时以来我尝试用xsd架构从xml文件中读出数据,但我无法弄清楚我是如何处理数据的。我可以验证文件,但我无法访问数据, 如何创建一个对象,我是否必须创建一个新的xml文件?

谢谢!

这是迄今为止的代码 PHP

$doc = new DOMDocument();
$doc->load('xml/test.xml');
if ($doc->schemaValidate('http://caaml.org/Schemas/V5.0/Profiles/BulletinEAWS/CAAMLv5_BulletinEAWS.xsd')) {

    echo $doc->MetaData;
}

这里是xml文件的前几行

<?xml version="1.0" encoding="UTF-8"?>
<caaml:Bulletin xmlns:caaml="http://caaml.org/Schemas/V5.0/Profiles/BulletinEAWS" xmlns:gml="http://www.opengis.net/gml" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://caaml.org/Schemas/V5.0/Profiles/BulletinEAWS http://caaml.org/Schemas/V5.0/Profiles/BulletinEAWS/CAAMLv5_BulletinEAWS.xsd" gml:id="BulletinDeID1175">
  <caaml:metaDataProperty>
    <caaml:MetaData>
      <caaml:dateTimeReport>2014-03-06T07:30:00+01:00</caaml:dateTimeReport>
      <caaml:srcRef xlink:href="OpIDLwdTirol"/>
      <caaml:comment>Rudi Mair</caaml:comment>
    </caaml:MetaData>
  </caaml:metaDataProperty>
  <caaml:validTime>
    <caaml:TimeInstant>
      <caaml:timePosition>2014-03-06+01:00</caaml:timePosition>
    </caaml:TimeInstant>
  </caaml:validTime>
  <caaml:bulletinResultsOf>
    <caaml:BulletinMeasurements>
      <caaml:extFiles>
        <caaml:ExtFile gml:id="ExtFileID01">
          <caaml:description></caaml:description>
          <caaml:fileReferenceURI>http://lwdweb.tirol.gv.at/fotos/Franz_Senn_Huette.jpg</caaml:fileReferenceURI>
        </caaml:ExtFile>
      </caaml:extFiles>

1 个答案:

答案 0 :(得分:1)

只有在文件有效时才会调用您的代码块。你的例子不完整。我认为它是完整有效的。考虑到这一点,您的问题与XML Schema无关,而是与节点选择和XML命名空间无关。

您可以使用XPath提取数据。您还需要注册命名空间,因为您的XML源使用了一个命名空间。下面的代码从源XML中读取三个字段:

$doc = new DOMDocument();
$doc->load('xml/test.xml');

$xpath = new DOMXpath($doc);
$xpath->registerNamespace("caaml", "http://caaml.org/Schemas/V5.0/Profiles/BulletinEAWS");

if ($doc->schemaValidate('http://caaml.org/Schemas/V5.0/Profiles/BulletinEAWS/CAAMLv5_BulletinEAWS.xsd')) {

    echo '<ul>'."\n";
    echo '    <li>dateTimeReport: '.$xpath->evaluate("//caaml:MetaData/caaml:dateTimeReport")->item(0)->nodeValue.'</li>'."\n";
    echo '    <li>srcRef: '.$xpath->evaluate("//caaml:MetaData/caaml:srcRef/@*[local-name()='href']")->item(0)->nodeValue.'</li>'."\n";
    echo '    <li>comment: '.$xpath->evaluate("//caaml:MetaData/caaml:comment")->item(0)->nodeValue.'</li>'."\n";
    echo '</ul>'."\n";

}

它将打印:

<ul>
    <li>dateTimeReport: 2014-03-06T07:30:00+01:00</li>
    <li>srcRef: OpIDLwdTirol</li>
    <li>comment: Rudi Mair</li>
</ul>

您可以在此处查看并测试它:http://codepad.viper-7.com/fRBDrU