XML

可扩展标记语言 (XML) 是一种现代 Web 应用程序中常用的数据格式。XML 使用自定义标签来描述数据,并以纯文本形式编码,使其既灵活又易于使用。GWT 类库包含一组专为处理 XML 数据而设计的类型。

  1. XML 类型
  2. 解析 XML
  3. 构建 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))。