在java中尝试使用Regex Expression提取XMLNS

时间:2014-05-28 20:53:11

标签: java regex xml string xml-namespaces

我已经尝试了几个小时才能做到这一点,我似乎无法做到这一点......

给定一个字符串

"xmlns:oai-identifier=\"http://www.openarchives.org/OAI/2.0/oai-identifier\""

"保存"正确表达式是什么? http://www.openarchives.org/OAI/2.0/oai-identifier位?

提前致谢,确实无法做到这一点。

String validXML = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><feed "
            + "xmlns:oai-identifier=\"http://www.openarchives.org/OAI/2.0/oai-identifier\" "
            + "xmlns:mingo-identifier=\"http://www.google.com\" "
            + "xmlns:abeve-identifier=\"http://www.news.ycombinator.org/OAI/2.0/oai-identifier\">"
            + "</feed>";

    Pattern p = Pattern.compile(".*\\\"(.*)\\\".*");
    Matcher m = p.matcher(validXML);
    System.out.println(m.group(1));

不打印任何东西。请注意,这个尝试只是为了将字符串放在引号内,一旦我开始工作,我就会担心另一部分......糟糕的是我从来没有这样做过。感谢

3 个答案:

答案 0 :(得分:2)

正则表达式非常昂贵 - 当您不需要时,请不要使用它们!还有一百万种其他方法可以解析字符串。

String validXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><feed "
        + "xmlns:oai-identifier=\"http://www.openarchives.org/OAI/2.0/oai-identifier\" "
        + "xmlns:mingo-identifier=\"http://www.google.com\" "
        + "xmlns:abeve-identifier=\"http://www.news.ycombinator.org/OAI/2.0/oai-identifier\">"
        + "</feed>";
String start = "xmlns:oai-identifier=\"";
String end = "\" ";
int location = validXml.indexOf(start);
String result;
if (location > 0) {
    result = validXml.substring(location + start.length(), validXml.length());
    int endIndex = result.indexOf(end);
    if (endIndex > 0) {
        result = result.substring(0, endIndex);
    }
    else {
        throw new Exception("Could not find end!");
    }


}
else {
    throw new Exception("Could not find start!");
}
System.out.println(result);

答案 1 :(得分:2)

由于您正在阅读XML,因此可能正在使用DOM,因此在解析文档并将lookupNamespaceURI()选项设置为{{1}时,可以使用setNamespaceAware()从前缀名称中提取命名空间}:

true

它更简单,你不必进行任何字符串解析。

答案 2 :(得分:1)

我认为问题可能是您的正则表达式中的第一个.*过于急切并且匹配的字符比您想要的多。

尝试将".*\\\"(.*)\\\".*"更改为"xmlns.*=\"(.*)\".*",看看是否有效。

如果它最初不起作用,您还可以尝试重新启动引用转义。在我的头脑中,我认为你不需要它们逃脱,但我不是百分百肯定。

另请注意,这只会匹配单个名称空间声明,而不是示例中validXML变量中的每个名称空间声明。您必须拆分字符串才能在任意数量的xmlns:.*=属性上使用它。