XML
可扩展标记语言 (XML) 是一种现代 Web 应用程序中常用的数据格式。XML 使用自定义标签来描述数据,并以纯文本形式编码,使其既灵活又易于使用。GWT 类库包含一组专为处理 XML 数据而设计的类型。
XML 类型
GWT 提供的 XML 类型可以在 com.google.gwt.xml.client 包中找到。为了在应用程序中使用这些类型,您需要在 模块 XML 文件 中添加以下 <inherits>
标签
<inherits name="com.google.gwt.xml.XML" />
解析 XML
为了演示如何使用 GWT 解析 XML,我们将使用以下包含电子邮件消息的 XML 文档
<?xml version="1.0" ?>
<message>
<header>
<to displayName="Richard" address="[email protected]" />
<from displayName="Joyce" address="[email protected]" />
<sent>2007-05-12T12:03:55Z</sent>
<subject>Re: Flight info</subject>
</header>
<body>I'll pick you up at the airport at 8:30. See you then!</body>
</message>
假设您正在编写一个电子邮件应用程序,需要从 XML 中提取发件人姓名、主题行和邮件正文。以下示例代码将执行此操作(我们稍后将解释代码)
private void parseMessage(String messageXml) {
try {
// parse the XML document into a DOM
Document messageDom = XMLParser.parse(messageXml);
// find the sender's display name in an attribute of the <from> tag
Node fromNode = messageDom.getElementsByTagName("from").item(0);
String from = ((Element)fromNode).getAttribute("displayName");
fromLabel.setText(from);
// get the subject using Node's getNodeValue() function
String subject = messageDom.getElementsByTagName("subject").item(0).getFirstChild().getNodeValue();
subjectLabel.setText(subject);
// get the message body by explicitly casting to a Text node
Text bodyNode = (Text)messageDom.getElementsByTagName("body").item(0).getFirstChild();
String body = bodyNode.getData();
bodyLabel.setText(body);
} catch (DOMException e) {
Window.alert("Could not parse XML document.");
}
}
第一步是将原始 XML 文本解析为一个 XML DOM 结构,我们可以使用它来导航数据。GWT 的 XML 解析器包含在 XMLParser 类中。调用其 parse(String) 静态方法来解析 XML 并返回一个 Document 对象。如果在解析过程中发生错误(例如,如果 XML 不是 格式良好的),XMLParser 将抛出一个 DOMException。
如果解析成功,我们收到的 Document 对象将表示内存中的 XML 文档。它是一个由通用 Node 对象组成的树。XML DOM 中的节点是 XML 文档中数据的基本单元。GWT 包含 Node 的几个子接口,这些接口提供专门的方法来处理各种类型的节点
Element - 表示 DOM 元素,这些元素由 XML 中的标签指定:
<someElement></someElement>
。Text - 表示元素的开始和结束标签之间的文本:
<someElement>这里有一些文本。</someElement>
。Comment - 表示 XML 注释:
<!-- 关于此数据的说明 -->
。Attr - 表示元素的属性:
<someElement myAttribute="123" />
。
有关从 Node 派生的类型的完整列表,请参阅 Node 接口的文档。
要从 Document 对象获取 DOM 节点,我们可以使用三种方法之一。 getDocumentElement() 方法将文档元素(DOM 树根部的最顶层元素)检索为一个 Element。然后,我们可以使用 Element 派生的 Node 类的导航方法(例如,getChildNodes(),getNextSibling(),getParentNode() 等)来深入挖掘并检索我们所需的数据。
我们还可以使用 getElementById(String) 和 getElementsByTagName(String) 方法直接转到特定节点或节点列表。getElementById(String) 方法将检索具有指定 ID 的 Element。如果您想在 XML 中使用 ID,则需要在 XML 文档的 DTD 中提供用作 ID 的属性的名称(仅设置名为 id
的属性将不起作用)。getElementsByTagName(String) 方法在您想要检索具有特定标签名称的一个或多个元素时很有用。元素列表将以 NodeList 对象的形式返回,可以对其进行迭代以获取它包含的各个 Node。
在示例代码中,我们使用 getElementsByTagName(String) 方法从包含电子邮件消息的 XML 中检索必要的元素。发件人姓名存储为 <from>
标签的属性,因此我们使用 getAttribute(String)。主题行存储在 <subject>
标签内的文本中,因此我们首先找到主题元素,然后检索其第一个(也是唯一一个)子节点并对其调用 getNodeValue() 来获取文本。最后,邮件正文以相同的方式存储(<body>
标签内的文本),但这次我们显式地将 Node 转换为 Text 对象并使用 getData() 提取文本。
构建 XML 文档
除了解析现有文档之外,GWT XML 类型还可以用于创建和修改 XML。要创建一个新的 XML 文档,请调用 XMLParser 类的静态 createDocument() 方法。然后,您可以使用生成的 Document 的方法来 创建元素、文本节点 和其他 XML 节点。这些节点可以使用 appendChild(Node) 和 insertBefore(Node, Node) 方法添加到 DOM 树中。 Node 还具有用于替换和删除子节点的方法(分别为 replaceChild(Node, Node) 和 removeChild(Node))。