XML - XSD验证错误:验证根

时间:2017-09-14 18:04:44

标签: php xml validation xsd

我有一个XML文件,我试图使用CDA架构基础结构进行验证。

$domxml = new DOMdocument();
$domxml->load($fil);
if($domxml->SchemaValidate('filepath/cda/POCD_MT000040_SDTC.xsd')) {
//do stuff
} else {
     print_recursive(libxml_get_errors())
}

我的XML文件包含以下标题:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ccda.xsl"?>
<ClinicalDocument 
  xsi:schemaLocation="urn:hl7-org:v3 
      http://xreg2.nist.gov:8080/hitspValidation/schema/cdar2c32/infrastructure/cda/C32_CDA.xsd" 
  xmlns="urn:hl7-org:v3" 
  xmlns:sdtc="urn:hl7-org:sdtc" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <realmCode code="US"/>
  <typeId root="2.16.840.1.113883.1.3" extension="POCD_HD000040"/>

我的XSD文件包含以下标题:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xs:schema targetNamespace="urn:hl7-org:v3" 
  xmlns:mif="urn:hl7-org:v3/mif" 
  xmlns="urn:hl7-org:v3" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  elementFormDefault="qualified" 
  xmlns:sdtc="urn:hl7-org:sdtc">

libxml提供的错误消息是这样的:

  

错误1845:行:1列:0:元素'{urn:hl7-org:v3} ClinicalDocument':没有可用于验证根目录的匹配全局声明。

我看过这个错误信息出现的其他例子,这是一个非常模糊的错误,在我的搜索中,意味着大约15种不同的,完全相互矛盾的事情 - 但我已经把它缩小到了XML的标头或XSD的标头。我不认为我在PHP中加载或验证它不正确,但我可能会弄错。

有人告诉我使用这个文件(以及它包含的所有文件,它们都存在)作为我正在使用的XML文档的XSD验证器,所以我不确定我是否做错了什么(下载了XSD文件,上传到服务器,使用domdocument schemavalidate指向它们,或者我的XML文件头是错误的(不太可能,因为我提供的测试用例应该按照他们的标准正常运行),或者XSD是错误的(也许我抓错了?)

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:0)

不确定我是否应该回答我自己的问题,但我会把它留在这里以防有人遇到同样的问题。

在对此进行了一些分析之后,我四处寻找了另一个版本的CDA XSD - 并最终找到一个包含文件(CDA_SDTC.xsd)的文件,其中包含以下几行:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by Bob Dolin (HL7 CDA TC) -->
<xs:schema targetNamespace="urn:hl7-org:v3" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sdtc="urn:hl7-org:sdtc" xmlns="urn:hl7-org:v3" xmlns:mif="urn:hl7-org:v3/mif"
  elementFormDefault="qualified">
  <xs:annotation>
    <xs:documentation>Manually edited to add SDTC Schema Extension (authenticator/signatureText, legalAuthenticator/signatureText), 14 July 2013</xs:documentation>
    <xs:documentation>Manually edited to add SDTC Schema Extensions, July 2012</xs:documentation>
  </xs:annotation>
  <xs:include schemaLocation="POCD_MT000040_SDTC.xsd"/>
  <xs:element name="ClinicalDocument" type="POCD_MT000040.ClinicalDocument"/>
</xs:schema>

这个包含的文件(POCD_MT000040_SDTC.xsd)是我粘贴上面标题的XSD,关键的是,这个文件包含行

<xs:element name="ClinicalDocument" type="POCD_MT000040.ClinicalDocument"/>

这是我实际开始处理XSD所需的类型声明。它现在可以完美地验证这个新的CDA_SDTC.xsd文件(并且不会验证它何时不应该!)