Simplexml使用内联命名空间解析XML

时间:2012-10-23 10:18:03

标签: php xml simplexml

如何解析如下所示的文档?

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
       <s:AttributeType name='StMovement' rs:number='1' rs:nullable='true' rs:writeunknown='true'>
        <s:datatype dt:type='number' rs:dbtype='numeric' dt:maxLength='19' rs:scale='0' rs:precision='28' rs:fixedlength='true'/>
    </s:AttributeType>
    </s:ElementType>
</s:Schema>

<rs:data>
<z:row StMovement='21123'/>
</rs:data>

我知道有类似.children(<schemaurl>)的内容,但只有在某个网址上有xsd时才有效。

1 个答案:

答案 0 :(得分:1)

请参阅the ->children() method的文档。命名空间标识符不必指向XSD以便以这种方式使用,您只需要知道要传入的URI字符串。

您还可以将该方法的第二个参数设置为true,并使用命名空间的本地别名/前缀,这在理论上不太可靠,但在实践中通常很好。

在您的情况下(如果您添加上面示例中缺少的</xml>),以下两种方法都可以正常工作:

echo (string)$sx->children('uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882')->Schema->attributes()->id;
echo (string)$sx->children('s', true)->Schema->attributes()->id;