0

我正在尝试编写一个正则表达式来匹配一个 xml 文档。我没有立即使用 xml 解析器的原因是因为该文件可能包含多个 xml 文件(格式是否正确),所以我想在解析之前删除格式不正确的文件。

xml结构:

<company>
    .....
    <Employees>
    .......
    </Employees>
</company>

代码

    final String xmlString = "...";
    final List<String> data = new ArrayList<String>();
    try
    {
        final Pattern pattern = Pattern.compile("<company>(.+?)</company>", Pattern.DOTALL);
        final Matcher matcher = pattern.matcher(xmlString);
        while (matcher.find())
        {
            final Pattern pattern1 = Pattern.compile("<Employees>(.+?)</Employees>", Pattern.DOTALL);// "+?"
            final Matcher matcher1 = pattern1.matcher(matcher.group(1));
            if (matcher1.find())
            {
                data.add(matcher1.group(1));
            }
        }
    }
    catch (final Exception e)
    {

    }

如果 xml 字符串包含一个格式正确或格式不正确的 xml 字符串,则此方法可以正常工作。但是当您有一个格式不正确的 xml 后跟格式正确的 xml 时,这不起作用。

<company>
    <Employees>

   </Employees>
<company>
    .....
    <Employees>
    .......
    </Employees>
</company>

在这种情况下,它返回整个字符串而不是格式良好的 xml。

请帮忙谢谢!!

4

2 回答 2

2

用一个正则表达式来做这件事永远不会奏效。

假设开始和结束标记出现在不同的行上,您需要一次处理一行 XML,跟踪您所看到的内容并缓冲输入,直到您识别出完整的有效子文档。

伪代码:

buffer = ""
while (line = read_input)
{
    if tag=="<company>"
    {
        buffer = "" // discard whatever we have seen since it didn't end with </company>
        buffer += line
    }
    else if tag=="</company>"
    {
        buffer += line
        write buffer
        buffer = ""
    }
    else
        buffer += line
}

这是如何解决问题的总体思路……细节可以改进(留作练习)。

于 2013-07-01T16:37:00.400 回答
0

您正在解析一种类似于 XML 但又不完全相同的语言。

因此,您需要做的第一件事是指定该语言的语法:您的解析器将接受什么结构?

然后你需要编写你的解析器。几乎可以肯定,您的语言的语法将是递归的,这意味着它将超出正则表达式的解析能力。您可以使用 JavaCC 等工具编写解析器。

但是你需要做一些阅读。如果您尝试使用正则表达式来完成这项工作,这表明您不了解您正在解决的问题背后的基本计算机科学。如果你是一个聪明的黑客,你可能能够敲出一些适用于你大部分输入文档的东西,但是除非你理解并应用它,否则它总是有在下一个文件上失败的风险。

于 2013-07-01T17:24:53.980 回答