可扩展标记语言——eXtensible MarkupLanguage
用户可以自己定义语言标记,只要有开始和闭合标签即可。
xsl装饰、修饰xml的显示结果。
dtd约束xml文件中的标记。
Ø XML的优点:
1、xml可以让数据和标记分离。
2、异质信息互通
3、机器语言
4、用交流语言替代html装饰语言
5、简单易用
6、可以自定义、可扩展
Ø XML和HTML比较
比较内容 | HTML | XML |
可扩展性 | 不具有扩展性、标记固定 | 是元标记语言,可以定义新标记,用户可以自定义标记 |
侧重点 | 侧重于信息的表现形式为什么格式被关注 | 侧重于结构化的描述信息,数据是什么为XML所关注 |
语法 | 不严格(嵌套、配对) | 严格嵌套、配对,并按照DTD要求输出 |
可读性、可维护性 | 难于阅读和维护 | 结构清晰,便于阅读维护 |
数据本身、显示 | 数据和显示合为一处 | 数据与显示分离 |
重用性 | 低 | 可重用性高 |
Ø JDOM操作XML
JDOM可以很方便的操作XML文档,完成XML内容的创建、修改,已经遍历Document文档中的XML元素,完成查询等。下面我们就用JDOM完成这些功能。
/**
* <b>function:</b>打印doc相关信息
* @author hoojo
* @createDate 2011-8-10 下午06:29:01
*/
@SuppressWarnings("unchecked")
@Test
public void printInfo() {
SAXBuilder builder = new SAXBuilder();
try {
//builder.setFeature("user", true);
//builder.setIgnoringBoundaryWhitespace(true);
//忽略元素内容的空格
//builder.setIgnoringElementContentWhitespace(true);
Document doc = builder.build(new File("file/web.xml"));
fail("baseURI: " + doc.getBaseURI());
fail("ContentSize: " + doc.getContentSize());
//System.out.println("getContent: ");
//print(0, doc.getContent());
fail("getContent index: " + doc.getRootElement().getContent(1));
fail("getDocType: " + doc.getDocType());
fail("getParent: " + doc.getRootElement().getContent(1).getParent());
fail("getProperty: " + doc.getProperty("filter"));
print(0, XPath.selectNodes(doc, "//*[contains(text(), "#")]"));
fail("getText: " + ((Element)XPath.selectNodes(doc, "//*[contains(text(), "#")]").get(0)).getText());
fail("getTextTrim: " + ((Element)XPath.selectNodes(doc, "//*[contains(text(), "#")]").get(0)).getTextTrim());
fail("getTextNormalize: " + ((Element)XPath.selectNodes(doc, "//*[contains(text(), "#")]").get(0)).getTextNormalize());
fail("hasRootElement: " + doc.hasRootElement());
//如果文档带有Namespace一定要设置Namespace,不然无法读取内容
Namespace ns = Namespace.getNamespace("http://java.sun.com/xml/ns/javaee");
Element servletEl = doc.getRootElement().getChild("servlet", ns);
fail("servletEl: " + servletEl);
print(0, servletEl.getChildren());
fail("getChildText: " + servletEl.getChildText("servlet-class", ns));
fail("getChildTextNormalize: " + servletEl.getChildTextNormalize("servlet-name", ns));
fail("getChildTextTrim: " + servletEl.getChildTextTrim("servlet-class", ns));
fail("getName: " + servletEl.getName());
fail("getNamespacePrefix: " + servletEl.getNamespacePrefix());
fail("getNamespace: " + servletEl.getNamespace());
fail("getQualifiedName: " + servletEl.getQualifiedName());
Element classEl = servletEl.getChild("servlet-class", ns);
fail("getText: " + classEl.getText());
fail("getTextNormalize: " + classEl.getTextNormalize());
fail("getTextTrim: " + classEl.getTextTrim());
fail("getValue: " + classEl.getValue());
//删除节点
fail(doc.getRootElement().removeContent(3));
//print(0, doc.removeContent());
//print(0, doc.getRootElement().getChildren());
fail(servletEl.removeChild("servlet-class", ns));
fail(servletEl.removeChildren("init-param", ns));
print(0, servletEl.getChildren());
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}