【问题标题】:php read xml data with xsd schemaphp 使用 xsd 模式读取 xml 数据
【发布时间】:2014-06-05 13:31:11
【问题描述】:

从几个小时以来,我尝试从具有 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>

【问题讨论】:

    标签: php xml xsd


    【解决方案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

    【讨论】:

    • 太好了,非常感谢!这是我搜索的这一行:$xpath->evaluate("//caaml:MetaData/caaml:dateTimeReport")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多