我正在尝试编写一个正则表达式来匹配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。
请帮助谢谢!!
答案 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>