XML程序设计习题解答__耿祥义__张跃平_编著
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
XML程序设计课后习题
习题一
1.答:HTML是用来编写Web页的语言、不允许用户自定义标记,HTML体现数据的显示格式。
XML描述数据的组织结构、可自定义标记,其标记名称是对标记所包含的数据内容含义的抽象,而不是数据的显示格式。
2.答:使用UTF-8保存5.答:(1)不可以,(2)可以,(3)不可以6.答:
Show.css:
time
{ display:block;font-size:18pt;font-weight:bold
}
hour
{ display:line;font-size:16pt;font-style:italic
}
mimute
{ display:line;font-size:9pt;font-weight:bold
}
习题二1.答:(1)使用ANSI编码。
(2)可以。
(3)不合理。
2.答:不相同。
3.答:(1)和(2)。
4.答:A3.xml。
5.答:“root”标记包含的文本内容都是空白字符。
“a1”标记包含的文本内容:<CCTV5>。
“a2”标记包含的文本内容:子曰"有朋自远方来,不亦乐乎"。
6.答:解析器不对CDATA段的内容做分析处理,CDATA段中的内容可以包含任意的字符。
(1)和(5)是正确的CDATA段。
(2)不正确,原因是CDATA段的开始标识中有回行,(3)不正确,原因是:CDATA段的结束标识不正确,(4)不正确,原因是CDATA段中嵌套了另一个CDATA段。
7.答:<p1:开关> 我也是中国制造的</p1:开关>
是错误的,因为p1的有效范围是在“电视机”标记中。
8.答:标记:" root "未隶属任何名称空间
标记:" 电视机"隶书的名称空间:
标记:" 显示器"隶书的名称空间:
标记:" 开关"隶书的名称空间:
标记:" 电线"隶书的名称空间:
习题三1.答:一个规范的XML文件如果和某个DTD文件相关联,并遵守该DTD文件规定的约束条件,就称之为有效的XML文件。
2.答:DTD文件的编码必须和其约束的XML文件的编码相一致。
3.答:无关。
4.答:(1) 使用SYSTEM文档类型声明的格式:
<DOCTYPE 根标记的名称 SYSTEM "DTD文件的URI">
(2) 使用PUBLIC文档类型声明的格式:
<!DOCTYPE 根标记的名称PUBLIC "正式公用标识符" "DTD文件的URI">
5.答:一定。
6.答:(1)约束标记“张三”必须有“学号”属性
(2)约束标记“张三”必须有“学号”属性,而且学号的属性值是固定的220123。
(3)约束标记“张三”可以有也可以没有“学号”属性。
7.答:ID类型的属性的属性值具有互斥性,即所有ID类型的属性的属性值必须互不相同。
8.答:不合理。
9.答:(1)、(3)和(4)。
10.答,B.xml不是有效的。
将B.xml修改为有效:
B.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 成绩单SYSTEM "A.dtd">
<成绩单>
<学生>
<姓名> 张三</姓名>
<成绩> 优秀</成绩>
</学生>
<学生>
<姓名> 李四</姓名>
<成绩> 良好</成绩>
</学生>
</成绩单>
11.答:Goods.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 商品信息SYSTEM "dtdFile.dtd">
<商品信息>
<商品商标=“Lenovo”>
<p:名称xmlns:p=“ookk”条形码=“1298-24”>
联想电脑
</p:名称>
<价钱>1234</价钱>
<连锁店>
<q:名称xmlns:q="Beijing" >
中关村专卖店
</q名称>
<地点> 北京市</地点>
</连锁店>
</商品>
</商品信息>
习题四1.答:使用操作指令:
<?xml-stylesheet href ="样式表的URI" type= "text/css" ?>
2.答:
student
{ display:block;font-size:18pt; color:red;
}
3.答:假设XML文件中有三个标记的名称都是“name”,“ID”属性分别是a001,a002,a003。
CSS文件如下:
namea001
{ display:block;
border-style:double;
width=260;
height=120
}
namea002
{ display:block;
border-style:dotted;
width=150;
height=60 ;
font-size:10pt;
}
namea003
{ display:block;
border-style:ridge;
width=90;
height=30;
font-size:10pt;
}
4.答:修改XML文件。
5.答:
math
{ display:block;
font-size:12pt;
font-style:italic;
background-color:rgb(227,228,229);
}
chemistry
{ display:block;
font-size:12pt;
text-decoration:underline;
background-color:cyan;
}
low
{ display:line;
font-size:8pt;
vertical-align:bottom;
}
习题五1.答:由若干个模板所构成,但必须有一个主模板。
2.答:必须有主模板吗。
主要体现在该模板中的match属性的值是“/”:
<xsl:template match="/">
主模板的内容
</xsl:template>
3.答:student的孙标记。
4.答:
<HTML>
<table border="1">
<tr>
<th> <台灯/></th>
<td>234元</td>
<td>北京</td>
</tr>
<tr>
<th> <壁灯/></th>
<td>56元</td>
<td>上海</td>
</tr>
</table>
</HTML>
5.答:
<HTML>
<table border="1">
<tr>
<td> <张三/></td>
<td>获得一等奖学金</td>
<td>25岁</td>
</tr>
</table>
</HTML>
习题六 1.答:一个返回子孙节点,而另一个只返回子节点:(1)getElementsByTagName(String name):返回一个NodeList对象,该对象由当前节点的Element类型子孙节点组成,这些子孙节点的名字由参数name指定(2)getChildNodes():节点调用该方法返回一个由当前节点的所有子节点组成的NodeList对象。
2.答:分别是DocumentType类型和Element类型。
3.答:Element类型?
4.答:不可以。
5.答:
JAXPXiti5.java
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class JAXPXiti5
{
public static void main(String args[])
{
OutResult outContent=new OutResult();
try {
DocumentBuilderFactory factory=
DocumentBuilderFactory. newInstance();
DocumentBuilder builder= factory. newDocumentBuilder();
Document document= builder. parse(new File("a.xml")) ;
Element root=document.getDocumentElement() ;
String rootName=root.getNodeName();
NodeList nodeList=root.getChildNodes();
outContent.output(nodeList);
System.out.println("数学平均成绩"+outContent.mathAver);
System.out.println("物理平均成绩"+outContent.physicsAver);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
class OutResult
{
double sumAllMath,sumAllPhysics,mathAver,physicsAver;
int mathNumber=0, physicsNumber=0;
public void output(NodeList nodeList)
{
int size=nodeList.getLength();
for(int k=0;k<size;k++)
{
Node node=nodeList.item(k);
if(node.getNodeType()==Node.TEXT_NODE)
{
Text textNode=(Text)node;
String content=textNode.getWholeText();
System.out.print(content);
Element parent=(Element)textNode.getParentNode();
if(parent.getNodeName().equals("数学"))
{
mathNumber++;
sumAllMath=sumAllMath+Double.parseDouble(content.trim());
}
if(parent.getNodeName().equals("物理"))
{
physicsNumber++;
sumAllPhysics=sumAllPhysics+Double.parseDouble(content.trim());
}
}
if(node.getNodeType()==Node.ELEMENT_NODE)
{
Element elementNode=(Element)node;
String name=elementNode.getNodeName();
System.out.print(name);
NodeList nodes=elementNode.getChildNodes();
output(nodes);
}
}
mathAver=sumAllMath/mathNumber;
physicsAver=sumAllPhysics/physicsNumber;
}
}
6.答:
JAXPXiti6.java
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class JAXPXiti6{
public static void main(String args[]){
try { String [] 车次={"T21","K456","T89"};
String [] 区间={"北京-上海","长沙-北京","天津-重庆"};
DocumentBuilderFactory
factory=DocumentBuilderFactory.newInstance();
DocumentBuilder
domPaser=factory.newDocumentBuilder();
Document document=domPaser.newDocument();
document.setXmlVersion("1.0");
Element root=document.createElement("列车表");
document.appendChild(root);
for(int k=1;k<=车次.length;k++){
Node node=document.createElement("客车");
root.appendChild(node);
}
NodeList nodeList=document.getElementsByTagName("客车");
int size=nodeList.getLength();
for(int k=0;k<size;k++){
Node node=nodeList.item(k);
if(node.getNodeType()==Node.ELEMENT_NODE){
Element elementNode=(Element)node;
Node nodeName=document.createElement("车次");
Node nodeNumber=document.createElement("运行区间");
nodeName.appendChild(document.createTextNode(车次[k]));
nodeNumber.appendChild(document.createTextNode(区间[k]));
elementNode.appendChild(nodeName);
elementNode.appendChild(nodeNumber);
}
}
TransformerFactory
transFactory=TransformerFactory.newInstance();
Transformer
transformer=transFactory.newTransformer();
DOMSource domSource=new DOMSource(document);
File file=new File("列车表.xml");
FileOutputStream out=new FileOutputStream(file);
StreamResult xmlResult=new StreamResult(out);
transformer.transform(domSource, xmlResult);
out.close();
}
catch(Exception e){
System.out.println(e);
}
}
}
习题七1.答:DOM解析器的核心是在内存中建立和XML文件相对应的树形结构数据,如果XML文件较大,相应的Document对象就要占用较多的内存空间;SAX解析器不在内存中建立和XML文件相对应的树形结构数据,和DOM解析器相比,SAX解析器占有的内存少。
2.答:参见例子1的表7.1。
3.答:不报告。
4.答:uri和localName的取值是空字符组成的串,即uri="",localName="",参数qName取值是标记名称,atts是标记的所有属性的集合。
5.答:当忽略标记之间形成的空白区域时。
6.答:是“文件定位器”事件。
7.答:
Xiti7.java
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;
public class Xiti7
{
public static void main(String args[])
{
OutTotal outWeight=new OutTotal();
try {
DocumentBuilderFactory factory=DocumentBuilderFactory.
newInstance();
DocumentBuilder builder= factory. newDocumentBuilder();
Document document= builder.parse(new File("a.xml")) ;
Element root=document.getDocumentElement() ;
NodeList nodeList=root.getChildNodes();
outWeight.output(nodeList);
System.out.println("总重量:"+outWeight.sum);
}
catch(Exception e) {
System.out.println(e);
}
}
}
class OutTotal
{
double sum;
public void output(NodeList nodeList)
{
int size=nodeList.getLength();
for(int k=0;k<size;k++)
{
Node node=nodeList.item(k);
if(node.getNodeType()==Node.TEXT_NODE)
{
Text textNode=(Text)node;
String content=textNode.getWholeText();
System.out.print(content);
Element parent=(Element)textNode.getParentNode();
if(parent.getNodeName().equals("重量"))
sum=sum+Double.parseDouble(content.trim()); }
if(node.getNodeType()==Node.ELEMENT_NODE)
{
Element elementNode=(Element)node;
String name=elementNode.getNodeName();
System.out.print(name);
NodeList nodes=elementNode.getChildNodes();
output(nodes);
}
}
}
}
习题八1.答:Node节点由可细分为Document,Element,Text,Attribue,ProcessingInstruction和Namespace节点。
2.答:ProcessingInstruction和Element子节点。
3.答:Element类型节点对应XML中的标记。
4.答:可以。
5.答:一个XPath路径表达式由若干个“定位步”构成。
6.答:假设XPath绝对路径经过第n个定位步后寻找出的第n个节点集中包含有m个节点,这m个节点按着他们在XML文件对应的顺序进行排列,序号从1开始,然后这m个节点依次使用第n+1个定位步寻找节点,它们找出的全部节点就是XPath绝对路径经过第n+1个定位步后寻找出的第n+1个节点集,依次类推,XPath绝对路径经过最后一个定位步寻找出的节点集就是XPapth绝对路径寻找出的节点集。
5.答:谓词的目的是给出定位步所寻找出的节点需满足的进一步条件,即当前节点在使用定位步的轴和节点测试找出若干个节点后,再使用谓词从这些节点中筛选出满足谓词条件的节点。
6.答:
(1)按顺序对应着第一个名字是“教室”的标记中的第一个名字是“桌子”标记的“价格”标记。
(2) 对应着具有属性number,属性值是02、名字为“桌子”的标记,而且这些桌子标记有子标记“价格”,而且价格包含的文本是数字且值大于等于360。
(3)对应“教室”的属性。
(4)number属性所在的“教室”节点。
(5)109
(6)396,267
(7)对应着“教室”标记,具教室标记有孙标记“价格”,且“价格”标记含有的数字文本的值大于390,即是第2个“教室”标记。
(8)对应着价格标记,且“价格”标记含有的数字文本的值大于396。
7.答:
(1)【结果1】: A1001定单的总额:
(2)【结果2】: 40.0
(3)【结果3】: 4
(4)【结果4】:100
8.答:
Xiti8.java
import javax.xml.xpath.*;
import org.xml.sax.*;
import org.w3c.dom.*;
public class Xiti8{
public static void main(String args[]){
try{ XPathFactory xPathFactory=XPathFactory.newInstance();
XPath xPath=xPathFactory.newXPath();
InputSource source=new InputSource("Xiti8.xml");
String countPath="count(/货品列表/货品/重量)";
String sumPath="sum(/货品列表/货品/重量)";
Double
sum=(Double)xPath.evaluate(sumPath,source,XPathConstants.NUMBER);
double total=sum.doubleValue();
System.out.println("总重量:"+total);
}
catch(Exception exp){
System.out.println(exp);
}
}
}
9.答:
Student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<学生列表>
<学生学号='72349876'>
<姓名>张三</姓名>
<性别> 男</性别>
<年龄> 29 </年龄>
</学生>
<学生学号='12345678'>
<姓名>李张林</姓名>
<性别> 男</性别>
<年龄> 18 </年龄>
</学生>
<学生学号='000'>
<姓名>张李号</姓名>
<性别> 女</性别>
<年龄> 25 </年龄>
</学生>
</学生列表>
Aplication.java
public class Application{
public static void main(String args[]){
new StudentConditionWindow();
}
}
StudentConditionWindow.java
import java.awt.*;
import javax.swing.*;
public class StudentConditionWindow extends JFrame {
JTextField inputName,inputNumber;
JTextArea showResult;
JButton button;
Box baseBox ,boxV1,boxV2;
StudentConditionWindow(){
inputName=new JTextField(10);
inputNumber=new JTextField(10);
boxV1=Box.createVerticalBox();
boxV1.add(new Label("姓名中包含:"));
boxV1.add(new Label("学号中包含"));
boxV2=Box.createVerticalBox();
boxV2.add(inputName);
boxV2.add(inputNumber);
baseBox=Box.createHorizontalBox();
baseBox.add(boxV1);
baseBox.add(boxV2);
JPanel west=new JPanel();
west.add(baseBox);
button=new JButton("确定");
west.add(button);
add(west,BorderLayout.WEST);
showResult=new JTextArea(10,10);
showResult.setFont(new Font("宋体",Font.PLAIN,12));
add(new JScrollPane(showResult),BorderLayout.CENTER);
FindStudentByXPath findStudent; //负责使用XPath查询学生的对象
findStudent=
new
FindStudentByXPath(inputName,inputNumber,showResult,"student.xml");
button.addActionListener(findStudent);
setBounds(10,10,900,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
FindStudentByXPath.java
import javax.xml.xpath.*;
import org.w3c.dom.*;
import javax.swing.*;
import java.awt.event.*;
import org.xml.sax.*;
public class FindStudentByXPath implements ActionListener {
XPathFactory xPathFactory;
XPath xPath;
String positionPath;
InputSource source;
JTextField inputName,inputNumber;
JTextArea showResult;
FindStudentByXPath(JTextField inputName,JTextField inputNumber,JTextArea showResult,String fileName){
this.inputName=inputName;
this.inputNumber=inputNumber;
this.showResult=showResult;
xPathFactory=XPathFactory.newInstance();
xPath=xPathFactory.newXPath();
source=new InputSource(fileName);
this.positionPath=positionPath;
}
public void actionPerformed(ActionEvent e){
showResult.setText(null);
String studentName=inputName.getText().trim();
String studentNumber=inputNumber.getText().trim();
String predicates="[contains(姓名,'"+studentName+"') and "+
"contains(@学号,'"+studentNumber+"')]";
String path="/学生列表/学生"+predicates+"/*"; //XPath 路径表达式
try{
NodeList nodelist=
(NodeList)xPath.evaluate(path,source,XPathConstants.NODESET);
int size=nodelist.getLength();
for(int k=0;k<size;k++){
Node node=nodelist.item(k);
String name=node.getNodeName();
showResult.append(" "+name+":");
String content=node.getTextContent();
showResult.append(content+"\n");
if(name.startsWith("年龄"))
showResult.append("--------------------------\n");
}
}
catch(Exception exp){
showResult.setText(null);
showResult.append("异常:"+exp);
}
}
}
习题九
1.答:参考例子2即可完成。
2.答参见例子3即可完成。
习题十
1.答:不可以
2.答:不可以
3. 答:
student.xml
<?xml version="1.0" encoding="UTF-8" ?>
<雇员列表>
<雇员>
<姓名>张三</姓名>
<月薪>1235.89</月薪>
<参加工作时间>2000-12-12</参加工作时间>
</雇员>
<雇员>
<姓名>李四</姓名>
<月薪>3234.82</月薪>
<参加工作时间>2001-10-28</参加工作时间>
</雇员>
</雇员列表>
employee.xsd
<xsd:schema xmlns:xsd="/2001/XMLSchema">
<xsd:element name="雇员列表" >
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="雇员" minOccurs="1" maxOccurs="12089" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="雇员" >
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="姓名"/>
<xsd:element ref="月薪"/>
<xsd:element ref="参加工作时间"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="姓名" type="xsd:string"/>
<xsd:element name="参加工作时间" type="xsd:date"/> <!-- 对始发时间标记的约束-->
<xsd:element name="月薪" type="xsd:float"/><!--对车厢数目标记的约束--> </xsd:schema>。