5

我有一个 xml 文件,如下所示:

<file>
     <students>
          <student>
               <name>Arthur</name>
               <height>168</height>
          </student>
          <student>
               <name>John</name>
               <height>176</height>
          </student>
     </students>
</file>

如何检查每个开始标签是否有结束标签?例如,如果我不提供结束标签:

<file>
     <students>
          <student>
               <name>Arthur</name>
               <height>168</height>
          // Ending tag for student missing here
          <student>
               <name>John</name>
               <height>176</height>
          </student>
     </students>
</file>

如何继续解析文件的其余部分?

我尝试了这里解释的 SAX 解析器,但它不太适合我,因为如果我没有像我提供的第二个 xml 代码那样提供结束标记,它会引发异常。

4

3 回答 3

0

没有验证您的条件“对于每个开始标签,都有一个结束标签”的 XML 文件格式不正确。检查 XML 文件的格式是否正确是 XML 解析器的第一项工作(这是它的第一项任务)。因此,您需要一个 XML 解析器。

于 2012-10-31T15:41:08.830 回答
0

您找到的教程中有一个错误。可能会为同一个元素( sourcecharacters() )多次调用。标记元素结束的正确方法是重置. 注释部分包含显示所需更改的代码。endElement()

修复了该问题后,您可以进行错误检查startElement()以确保文件不会尝试在给定当前状态的情况下启动无效元素。这也将允许您确保name仅在元素内部找到student元素。

于 2012-10-31T15:41:28.583 回答
0

您可以实现以下算法(伪代码):

String xml = ...
stack = new Stack()

while True:

    tag = extractNextTag(xml)

    // no new tag is found
    if tag == null:
       break

    if (tag.isOpening()):
        stack.push(tag.name)
    else:
        oldTagName = stack.pop()
        if (oldTagName != tag.name):
            error("Open/close tag error")
if ! stack.isEmpty():
    error("Open/close tag error")

您可以使用一些有关解析器的知识或仅编写简单的正则表达式,用 10-20 行代码实现函数 extractNewTag。当然,当您搜索新标签时,您需要从找到的最后一个标签之后的符号开始搜索。

于 2012-10-31T15:43:39.440 回答