为何引用xml schema文件后用selectNodes(Exp)返回空值。

为何引用xml schema文件后用selectNodes(Exp)返回空值。

老师,在3-9自由编程作业中,我的xml文件引用xml schema约束文件后用用document.selectNodes(Exp)获取到的list<Node>为空,将以下引用(如下图)去掉换成引用dtd文件后就正常,这是什么原因呢??

http://img1.sycdn.imooc.com//climg/5d737f9f0001354f08330053.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

5回答
好帮手慕柯南 2019-09-08 12:08:11

同学你好!

这是由于同学xsd文件没有修改呢,老师对同学的xml和xsd都做了修改,同学可以参考一下:

xml:

<?xml version="1.0" encoding="UTF-8"?>
<teaching-plan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:noNamespaceSchemaLocation="plan.xsd">
    <course id="001">
        <course-name>大学英语</course-name>
        <class-hour>36</class-hour>
        <exam-form>考试</exam-form>
    </course>
    <course id="002">
        <course-name>高等数学1</course-name>
        <class-hour>70</class-hour>
        <exam-form>考试</exam-form>
    </course>
    <course id="003">
        <course-name>计算机应用基础</course-name>
        <class-hour>108</class-hour>
        <exam-form>上机考试</exam-form>
    </course>
    <course id="004">
        <course-name>Java编程</course-name>
        <class-hour>100</class-hour>
        <exam-form>上机考试</exam-form>
    </course>
    <course id="005">
        <course-name>艺术插花</course-name>
        <class-hour>25</class-hour>
        <exam-form>开卷考试</exam-form>
    </course>
</teaching-plan>

xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
   <xs:element name="teaching-plan">
      <xs:complexType>
         <xs:sequence>
            <xs:element name="course" maxOccurs="100">
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name = "course-name" type="xs:string"></xs:element>
                     <xs:element name = "class-hour">
                        <xs:simpleType>
                           <xs:restriction base="xs:integer">
                              <xs:minInclusive value="20"></xs:minInclusive>
                              <xs:maxInclusive value="110"></xs:maxInclusive>
                           </xs:restriction>
                        </xs:simpleType>
                     </xs:element>
                     <xs:element name = "exam-form" type = "xs:string"></xs:element>
                  </xs:sequence>
                  <xs:attribute name="id" type="xs:string" use="required"></xs:attribute>
               </xs:complexType>
            </xs:element>
         </xs:sequence>
      </xs:complexType>
   </xs:element>
</xs:schema>

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 慕九州6323415 #1
    是可以了,但是为什么要这么改呢??
    2019-09-09 19:57:37
  • 好帮手慕柯南 回复 提问者 慕九州6323415 #2
    同学,可能是由于是同学的命名空间不匹配导致的问题~这里同学了解即可。祝学习愉快~
    2019-09-10 11:17:53
提问者 慕九州6323415 2019-09-08 11:07:18

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
          targetNamespace="http://www.w3school.com.cn"
          xmlns="http://www.w3school.com.cn"
          elementFormDefault="qualified">
   <xs:element name="teaching-plan">
       <xs:complexType>
           <xs:sequence>
               <xs:element name="course" maxOccurs="100">
                   <xs:complexType>
                       <xs:sequence>
                           <xs:element name = "course-name" type="xs:string"></xs:element>
                           <xs:element name = "class-hour">
                               <xs:simpleType>
                                   <xs:restriction base="xs:integer">
                                       <xs:minInclusive value="20"></xs:minInclusive>
                                       <xs:maxInclusive value="110"></xs:maxInclusive>
                                   </xs:restriction>
                               </xs:simpleType>
                           </xs:element>
                           <xs:element name = "exam-form" type = "xs:string"></xs:element>
                       </xs:sequence>
                       <xs:attribute name="id" type="xs:string" use="required"></xs:attribute>
                   </xs:complexType>
               </xs:element>
           </xs:sequence>
       </xs:complexType>
   </xs:element>
</xs:schema>

好帮手慕柯南 2019-09-08 10:15:44

同学你好!

修改一下xml和xsd文件的头部

xml:

<teaching-plan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:noNamespaceSchemaLocation="plan.xsd">

xsd:

<schema xmlns="http://www.w3.org/2001/XMLSchema">

如果我的回答解决了你的疑惑,请采纳,祝学习愉快~

  • 提问者 慕九州6323415 #1
    修改完xml文件报错哦,我把xsd的代码也贴出来吧,老师你再看看是啥问题。
    2019-09-08 11:06:44
提问者 慕九州6323415 2019-09-07 19:27:41

/* 以下为Java代码*/

package xml;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.util.List;

public class TeachPlanXpath {

//    private String file = "D:\\java\\01_developer\\java_module3\\javaclass03\\src\\xml\\plan.xml";

   public void Xpath(String xpathExp){
       String file = "D:\\java\\01_developer\\java_module3\\javaclass03\\src\\xml\\plan.xml";
       SAXReader reader = new SAXReader();
       try {
           Document document = reader.read(file);
//            System.out.println(document);
           List<Node> nodes = document.selectNodes(xpathExp);
//            System.out.println(nodes);
           for(Node node : nodes) {
               Element course = (Element) node;
               System.out.println("课程ID为:"+course.attributeValue("id"));
               System.out.println("课程名称为:"+course.elementText("course-name"));
               System.out.println("课时为:"+course.elementText("class-hour"));
               System.out.println("考试形式为:"+course.elementText("exam-form"));
               System.out.println("----------------------------------------------------");
           }

       } catch (DocumentException e) {
           e.printStackTrace();
       }
   }

   public static void main(String[] args) {
       TeachPlanXpath teachPlan = new TeachPlanXpath();

       //teachPlan.Xpath("//course");
       // teachPlan.Xpath("//course[class-hour<50]");
       //teachPlan.Xpath("//course[course-name='高等数学']");
       //teachPlan.Xpath("//course[@id=001]");
       teachPlan.Xpath("//course[position()<3]");
   }
}

<!-- 以下为plan.xml文件-->

<?xml version="1.0" encoding="UTF-8"?>

<teaching-plan xmlns="http://www.w3school.com.cn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="plan.xsd">
   <course id="001">
       <course-name>大学英语</course-name>
       <class-hour>36</class-hour>
       <exam-form>考试</exam-form>
   </course>
   <course id="002">
       <course-name>高等数学</course-name>
       <class-hour>70</class-hour>
       <exam-form>考试</exam-form>
   </course>
   <course id="003">
       <course-name>计算机应用基础</course-name>
       <class-hour>108</class-hour>
       <exam-form>上机考试</exam-form>
   </course>
   <course id="004">
       <course-name>Java编程</course-name>
       <class-hour>100</class-hour>
       <exam-form>上机考试</exam-form>
   </course>
   <course id="005">
       <course-name>艺术插花</course-name>
       <class-hour>25</class-hour>
       <exam-form>开卷考试</exam-form>
   </course>
</teaching-plan>

好帮手慕阿莹 2019-09-07 19:16:10

同学的问题和这个同学的有些类似,可以参考一下这个同学的回答:https://class.imooc.com/course/qadetail/97176  

但看起来同学的这个用的也是不带命名空间的

如果还是没有解决,请同学贴一下你的代码,老师尝试调试一下。

注意不要贴在回复里,会失去代码的格式。可以在回答里贴一下。祝学习愉快。


  • 提问者 慕九州6323415 #1
    看不了,提示我没有沟通课程,我买的2019年的,你给的链接的课程好像是2018年的。
    2019-09-07 19:20:12
  • 好帮手慕阿莹 回复 提问者 慕九州6323415 #2
    非常抱歉,上边同学的情况是他的xml中使用了命名空间,建议同学把你的xml以及xsd文件,还有java文件都贴一下,老师测试一下。注意不要贴在回复里,会失去代码的格式。可以在回答里贴一下。祝学习愉快。
    2019-09-07 19:22:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师