2014-04-06 37 views
0

我在加载我的XML文档时遇到了问题。 XML文件是PHP DOMDocument没有返回或加载第一个元素

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE gallery [ 
<!ELEMENT gallery (category*)> 
<!ELEMENT category (image*)> 
<!ELEMENT image (title,comment,password,owner,rating)> 
<!ELEMENT title ANY> 
<!ELEMENT comment ANY> 
<!ELEMENT password ANY> 
<!ELEMENT owner ANY> 
<!ELEMENT rating ANY> 
<!ATTLIST category name CDATA #REQUIRED> 
<!ATTLIST image date CDATA #REQUIRED> 
]> 
<gallery> 
    <category name="entertainment"> 
     <image date="monday"> 
      <title>1</title> 
      <comment>2</comment> 
      <password>3</password> 
      <owner>4</owner> 
      <rating>5</rating> 
     </image> 
     <image date="friday"> 
      <title>11</title> 
      <comment>22</comment> 
      <password>33</password> 
      <owner>44</owner> 
      <rating>55</rating> 
     </image> 
    </category> 
    <category name="education"> 
    </category> 
    <category name="relax"> 
    </category> 
    <category name="sporting"> 
    </category> 
</gallery> 

而我的PHP打印此XML

$doc = new DOMDocument(); 
    $doc->validateOnParse = true; 
    $doc->load(ROOT_PATH."xml/data.xml"); 

    if($doc->validate()) { 
     print_r($doc->saveHTML()); 

    } 
    else echo 'Not Validated ';  

,其结果是

2 3 4 5 22 33 44 55 

顺便说一句,我不明白为什么第一个元素是跳过。我有问题,这样的

$category = $doc->getElementById('entertainment'); 

if (!$category){ 
    echo 'not found'; 
} 

返回选择元素:

not found 
+0

你是在浏览器中做这个吗?查看浏览器的_page source_查看XML结构。如果您刚刚看到'2 3 5 22 33 44 55',可能是因为浏览器正在将XML解释为HTML标记。你有什么工作将XML转储回屏幕:http://ideone.com/WtzeKM –

+0

而'娱乐'没有找到,因为没有'ID ='娱乐'元素,尽管你有'名称= entertainment''。 –

+0

感谢提示。但我的浏览器正确地在html中打印这个XML。女巫是1 2 3 4 5 11 22 33 44 55.而浏览器中的xml原始文件也是正确的。 – ianion

回答

0

这是没有意义的使用saveHTML这个XML文档上,因为它并不代表HTML。 A <title>元素在HTML中具有语义含义,并且它是不会显示在页面上的元素,所以这可能是您无法看到1和11的原因。

我怀疑你失败选择娱乐类别,因为您的DTD并不指示名称属性代表ID的任何地方。你需要在你的DTD里有这样的东西:

<!ATTLIST category name ID #REQUIRED> 
+0

谢谢你,我救了我的头像:)是的标题没有打印,因为特殊的含义。我已将此元素更改为另一个名称,现在可以使用。像你这样的宣言也是对的。我现在可以通过ID选择。再次感谢。 – ianion

相关问题