【发布时间】:2011-04-12 18:54:09
【问题描述】:
这开始让我很生气。我有这个 XML 代码:
更新为正确的命名空间
<?xml version="1.0" encoding="utf-8"?>
<Infringement xsi:schemaLocation="http://www.movielabs.com/ACNS http://www.movielabs.com/ACNS/ACNS2v1.xsd" xmlns="http://www.movielabs.com/ACNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Case>
<ID>...</ID>
<Status>Open</Status>
</Case>
<Complainant>
<Entity>...</Entity>
<Contact>...</Contact>
<Address>...</Address>
<Phone>...</Phone>
<Email>...</Email>
</Complainant>
<Service_Provider>
<Entity>...</Entity>
<Address></Address>
<Email>...</Email>
</Service_Provider>
<Source>
<TimeStamp>...</TimeStamp>
<IP_Address>...</IP_Address>
<Port>...</Port>
<DNS_Name></DNS_Name>
<Type>...</Type>
<UserName></UserName>
<Number_Files>1</Number_Files>
<Deja_Vu>No</Deja_Vu>
</Source>
<Content>
<Item>
<TimeStamp>...</TimeStamp>
<Title>...</Title>
<FileName>...</FileName>
<FileSize>...</FileSize>
<URL></URL>
</Item>
</Content>
</Infringement>
还有这个 PHP 代码:
<?php
$data = urldecode($_POST["xml"]);
$newXML = simplexml_load_string($data);
var_dump($newXML->xpath("//ID"));
?>
我只转储了 $newXML 并获得了大量数据,但我运行的唯一一个返回空数组以外的任何内容的 xPath 是“*”
“//ID”不应该找到文档中的所有ID节点吗?为什么它不起作用?
谢谢
【问题讨论】:
-
问题很可能是命名空间 (
xmlns:xsi)。不知道如何进一步提供帮助,技能不足:P -
不确定,但请尝试将
xmlns替换为ns。 (灵感来自this comment on PHP.net。 -
我可能听起来像个狂热分子,但恕我直言,删除名称空间以使 XPath 查询正常工作只是一种用于克服编程工具缺陷或程序员无能的 XML 破解黑客。命名空间是 XML 中的一个基本概念。任何打算使用 XML 的人都应该学会理解它们。
-
@Lekensteyn,一味地搞乱命名空间就像试图在黑暗中生下豪猪宝宝。为了解析 xsi:schemaLocation 属性,需要 xmlns:xsi 命名空间声明。如果将 xmlns 更改为 ns,XML 文档将不再是格式正确的。您所指的评论是替换 default 命名空间声明
xmlns=...(无冒号或前缀),它确定没有命名空间前缀的元素的命名空间。 @Codemonkey 没有默认命名空间声明,因此该注释不适用。 -
好的,文档已经被编辑,所以现在它有一个默认的命名空间声明。 @Codemonkey,不要要求我们诊断一个歪曲其内容的文档。