xml的正则表达式无法正常工作

时间:2013-07-01 15:40:19

标签: java xml regex

我正在尝试编写一个正则表达式来匹配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。

请帮助谢谢!!

2 个答案:

答案 0 :(得分: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
}

这是如何解决问题的一般概念......具体细节可以改进(留作练习)。

答案 1 :(得分:0)

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

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

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

但你需要做一些阅读。如果您尝试使用正则表达式执行此任务,这表明您不了解正在处理的问题背后的基本计算机科学。如果你是一个聪明的黑客,你可能会对你的大多数输入文档起作用,但是除非你理解并应用它,否则它总是有可能掉到下一个文档上。 / p>