谁能想象我为这道题纠结了4个小时了,实在解决不了了,求助,急急急!

惊了时光丨绿了芭蕉 2012-05-09 12:34:51
<?xml version="1.0" encoding="utf-8"?>

<!-- 文档类型(DTD) -->

<!DOCTYPE ShowList[
<!ELEMENT ShowList (Movie+)>
<!ELEMENT Movie (Name,Poster,Director,Actor,Type,Price,Schedule)>
<!ATTLIST Movie id CDATA #REQUIRED>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Poster (#PCDATA)>
<!ELEMENT Director (#PCDATA)>
<!ELEMENT Actor (#PCDATA)>
<!ELEMENT Type (#PCDATA)>
<!ELEMENT Price (#PCDATA)>
<!ELEMENT Schedule (Item+)>
<!ELEMENT Item (#PCDATA)>
]>


<ShowList>
<Movie id="001">
<Name>非常完美</Name>
<Poster>非常完美.jpg</Poster>
<Director>阴萌</Director>
<Actor>章子怡、范冰冰、何振东</Actor>
<Type>Romance</Type>
<Price>60</Price>
<Schedule>
<Item>9:00</Item>
<Item>13:00</Item>
</Schedule>
</Movie>
<Movie id="002">
<Name>风声</Name>
<Poster>风声.jpg</Poster>
<Director>陈国富</Director>
<Actor>周迅、李冰冰、张涵予</Actor>
<Type>Adventure</Type>
<Price>60</Price>
<Schedule>
<Item>11:20</Item>
<Item>15:45</Item>
<Item>19:25</Item>
</Schedule>
</Movie>
<Movie id="003">
<Name>窃听风云</Name>
<Poster>窃听风云.jpg</Poster>
<Director>麦兆辉/庄文强</Director>
<Actor>刘青云、吴彦族、古天乐</Actor>
<Type>Action</Type>
<Price>70</Price>
<Schedule>
<Item>21:00</Item>
<Item>23:10</Item>
</Schedule>
</Movie>
<Movie id="004">
<Name>非诚勿扰</Name>
<Poster>非诚勿扰.jpg</Poster>
<Director>冯小刚</Director>
<Actor>舒淇、葛优</Actor>
<Type>Romance</Type>
<Price>70</Price>
<Schedule>
<Item>17:30</Item>
</Schedule>
</Movie>
</ShowList>

问题1.针对电影ShowList.xml编写dtd
问题2.用java遍历ShowList.xml文件并输出

问题1上面已经写了,问题就出现在问题2上,把时间显示在item上这里卡住了,高手们,请解决吧,我就纠结了四个小时,其实题目难倒是不难,就是卡在这里了。写出代码吧,高手们,急急急啊!
...全文
183 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
以上代码是自己写的,可是效果没出来,也就是读取XMl文件的效果不是我想要的:

package ch14;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ShowListDao {

//读取电影MovieXML文件
public static void readerMovieListXml()
{
//得到DOM解析器实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
//从DOM工厂获得DOM解析器
DocumentBuilder dBuilder = dbf.newDocumentBuilder();

//解析XML文档,得到一个Document,即DOM树
Document doc = dBuilder.parse("src/ch14/ShowList.xml");

//查找DOM树下的根元素
Element root = doc.getDocumentElement();

//得到DOM树下根元素的名称
//System.out.println(root.getNodeName());

//获取根节点下的子结点
// NodeList nodeList = root.getChildNodes();

//获取根节点下节点的属性
NodeList nodeList = root.getElementsByTagName("Movie");

//循环遍历节点
for(int i=0;i<nodeList.getLength();i++)
{
// Node node = nodeList.item(i);
//
// //判断节点类型是否等于文档节点类型3
// if(node.getNodeType() == Node.ELEMENT_NODE)
// {
// System.out.println(node.getNodeName());
//
// }

Element node = (Element) nodeList.item(i);

//判断节点类型是否等于文档节点类型
if(node.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println(node.getNodeName()+"属性是:" + node.getAttribute("id"));

}

//获取根节点下的子结点下的节点
NodeList subList = node.getChildNodes();

//循环遍历
for(int j = 0; j<subList.getLength();j++)
{
Node subnode = subList.item(j);

//判断节点类型是否等于文档节点类型
if(subnode.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println(subnode.getNodeName() + ":" +subnode.getTextContent());
}

//获取根节点下的子结点下的节点
NodeList subfootList = subnode.getChildNodes();
for (int k = 0; k < subfootList.getLength(); k++)
{
Node subfootnode = subfootList.item(k);
if(subfootnode.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println(subfootnode.getNodeName() + ":" +subnode.getTextContent());
}
}
}
}

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

public static void main(String [] args)
{
readerMovieListXml();
}
}
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

介意楼主以后定义XML文件, 最好用 Schema
[/Quote]

回复5楼。 你有什么思路吗? 这道题我纠结了四个小时。谁能想象。 现在头还痛着。 帮忙改改代码。在此谢过而了,楼上已经给出效果了。但效果不对。
左眼跳跳 2012-05-09
  • 打赏
  • 举报
回复
介意楼主以后定义XML文件, 最好用 Schema
LanFavourite 2012-05-09
  • 打赏
  • 举报
回复
LZ,正在看......
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

在你的代码上进行了一些修改

// 判断节点类型是否等于文档节点类型
if (subnode.getNodeType() == Node.ELEMENT_NODE) {
/*一个节点的子节点有2中形式
* 1.是文本值,文本节点也是它的一个节点(<Price>70</Price> 70是price的子节点并且是#text类型);
* 2.子节点 (如……
[/Quote]

回复8楼,我自己解决了,谢谢了。你的思路的对的的,我的代码如下,

package ch14;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ShowListDao {

// 读取电影MovieXML文件
public static void readerMovieListXml() {
// 得到DOM解析器实例
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
// 从DOM工厂获得DOM解析器
DocumentBuilder dBuilder = dbf.newDocumentBuilder();

// 解析XML文档,得到一个Document,即DOM树
Document doc = dBuilder.parse("src/ch14/ShowList.xml");

// 查找DOM树下的根元素
Element root = doc.getDocumentElement();

// 得到DOM树下根元素的名称
System.out.println("文档树中根元素的名称是:" + root.getNodeName());

// 获取根节点下的子结点
// NodeList nodeList = root.getChildNodes();

// 获取根节点下节点的属性
NodeList nodeList = root.getElementsByTagName("Movie");

// 循环遍历节点
for (int i = 0; i < nodeList.getLength(); i++) {

Element node = (Element) nodeList.item(i);

// 判断节点类型是否等于文档节点类型
if (node.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(node.getNodeName() + "属性是:"
+ node.getAttribute("id"));

}

// 获取根节点下的子节点下的节点
NodeList subList = node.getChildNodes();

// 循环遍历
for (int j = 0; j < subList.getLength(); j++) {
Node subnode = subList.item(j);

// 判断节点类型是否等于文档节点类型
if (subnode.getNodeType() == Node.ELEMENT_NODE) {
if (subnode.getNodeName() == "Schedule") {
System.out.println(subnode.getNodeName());
// 获取根节点下的子结点下的节点
NodeList subfootList = subnode.getChildNodes();
for (int k = 0; k < subfootList.getLength(); k++) {
Node subfootnode = subfootList.item(k);
if (subfootnode.getNodeType() == Node.ELEMENT_NODE) {
System.out.println(subfootnode
.getNodeName()
+ ":"
+ subfootnode.getTextContent());
}
}
} else {
System.out.println(subnode.getNodeName() + ":"
+ subnode.getTextContent());
}

}
}

}

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

虽然是解决了,但还是谢谢你。
public static void main(String[] args) {
readerMovieListXml();
}
}
yang_yang_zy 2012-05-09
  • 打赏
  • 举报
回复
在你的代码上进行了一些修改

// 判断节点类型是否等于文档节点类型
if (subnode.getNodeType() == Node.ELEMENT_NODE) {
/*一个节点的子节点有2中形式
* 1.是文本值,文本节点也是它的一个节点(<Price>70</Price> 70是price的子节点并且是#text类型);
* 2.子节点 (如:<Schedule><Item>21:00</Item></Schedule>)
* 所以如果它的子节点<=1 则说明它下面是一个文本节点,而不是嵌套子节点<Schedule><Item>21:00</Item></Schedule>的形式
* 所以如果子节点>1则再次获取它的子节点
*/
if(subnode.getChildNodes().getLength()<=1) { System.out.println(subnode.getNodeName() + ":"
+ subnode.getTextContent());
}
else {
// 获取根节点下的子结点下的节点
NodeList subfootList = subnode.getChildNodes();
for (int k = 0; k < subfootList.getLength(); k++) {
Node subfootnode = subfootList.item(k);
if (subfootnode.getNodeType() == Node.ELEMENT_NODE) {
if(subfootnode.getChildNodes().getLength()<=1) { System.out.println(subfootnode.getNodeName() + ":" + subfootnode.getTextContent());
}
}
}
}
}
yang_yang_zy 2012-05-09
  • 打赏
  • 举报
回复
你用了subnode.getTextContent()这个方法是获取节点的文本值,所有只要它的子节点有文本值,它就会打印,你可以用一个判断语句将Schedule这个节点排除。
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
<?xml version="1.0" encoding="utf-8"?>

<!-- 文档类型(DTD) -->

<!DOCTYPE ShowList[
<!ELEMENT ShowList (Movie+)>
<!ELEMENT Movie (Name,Poster,Director,Actor,Type,Price,Schedule)>
<!ATTLIST Movie id……
[/Quote]

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

<!-- 文档类型(DTD) -->

<!DOCTYPE ShowList[
<!ELEMENT ShowList (Movie+)>
<!ELEMENT Movie (Name,Poster,Director,Actor,Type,Price,Schedule)>
<!ATTLIST Movie id CDATA #REQUIRED>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Poster (#PCDATA)>
<!ELEMENT Director (#PCDATA)>
<!ELEMENT Actor (#PCDATA)>
<!ELEMENT Type (#PCDATA)>
<!ELEMENT Price (#PCDATA)>
<!ELEMENT Schedule (Item+)>
<!ELEMENT Item (#PCDATA)>
]>


<ShowList>
<Movie id="001">
<Name>非常完美</Name>
<Poster>非常完美.jpg</Poster>
<Director>阴萌</Director>
<Actor>章子怡、范冰冰、何振东</Actor>
<Type>Romance</Type>
<Price>60</Price>
<Schedule>
<Item>9:00</Item>
<Item>13:00</Item>
</Schedule>
</Movie>
<Movie id="002">
<Name>风声</Name>
<Poster>风声.jpg</Poster>
<Director>陈国富</Director>
<Actor>周迅、李冰冰、张涵予</Actor>
<Type>Adventure</Type>
<Price>60</Price>
<Schedule>
<Item>11:20</Item>
<Item>15:45</Item>
<Item>19:25</Item>
</Schedule>
</Movie>
<Movie id="003">
<Name>窃听风云</Name>
<Poster>窃听风云.jpg</Poster>
<Director>麦兆辉/庄文强</Director>
<Actor>刘青云、吴彦族、古天乐</Actor>
<Type>Action</Type>
<Price>70</Price>
<Schedule>
<Item>21:00</Item>
<Item>23:10</Item>
</Schedule>
</Movie>
<Movie id="004">
<Name>非诚勿扰</Name>
<Poster>非诚勿扰.jpg</Poster>
<Director>冯小刚</Director>
<Actor>舒淇、葛优</Actor>
<Type>Romance</Type>
<Price>70</Price>
<Schedule>
<Item>17:30</Item>
</Schedule>
</Movie>
</ShowList>
由于上面发的没缩进,可能大家看起来比较困难,所以再次发过了。高手们。求救啊。
  • 打赏
  • 举报
回复
以上代码在控制台打印出来的效果如下:

Movie属性是:001
Name:非常完美
Poster:非常完美.jpg
Director:阴萌
Actor:章子怡、范冰冰、何振东
Type:Romance
Price:60
Schedule:9:0013:00
Item:9:0013:00
Item:9:0013:00
Movie属性是:002
Name:风声
Poster:风声.jpg
Director:陈国富
Actor:周迅、李冰冰、张涵予
Type:Adventure
Price:60
Schedule:11:2015:4519:25
Item:11:2015:4519:25
Item:11:2015:4519:25
Item:11:2015:4519:25
Movie属性是:003
Name:窃听风云
Poster:窃听风云.jpg
Director:麦兆辉/庄文强
Actor:刘青云、吴彦族、古天乐
Type:Action
Price:70
Schedule:21:0023:10
Item:21:0023:10
Item:21:0023:10
Movie属性是:004
Name:非诚勿扰
Poster:非诚勿扰.jpg
Director:冯小刚
Actor:舒淇、葛优
Type:Romance
Price:70
Schedule:17:30
Item:17:30

本来那个Schedule应该作为Item的父标签,没有东西的,但是如今却。。。。而且这个呀太难看了吧?

Schedule:11:2015:4519:25
Item:11:2015:4519:25
Item:11:2015:4519:25
Item:11:2015:4519:25

高手们,帮忙改改代码吧,在次谢过了,感觉不尽,我纠结了四个小时啊。头晕着。。。。哎。

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧