【问题标题】:In java trying to extract XMLNS using a Regexpression在 java 中尝试使用正则表达式提取 XMLNS
【发布时间】:2014-07-18 06:27:44
【问题描述】:

我已经尝试了几个小时才能做到这一点,但我似乎真的做不到......

给定一个字符串

"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));

没有打印出任何东西。请注意,这种尝试只是为了将字符串放在引号内,一旦我开始工作,我会担心另一部分......可惜我从来没有工作过。谢谢

【问题讨论】:

  • 真的很难做到这一点”我们可以看看你解决这个问题的尝试吗?
  • 当然,我的尝试,只是在引号中提取内容,在我弄清楚之后会担心 xmlns。感谢您格式化我的帖子,长期潜伏者,第二次海报:)

标签: java regex xml string xml-namespaces


【解决方案1】:

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

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

如果一开始不起作用,您也可以尝试重新设置引号转义。在我的脑海中,我认为你不需要他们逃跑,但我不是 100% 确定。

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

【讨论】:

  • 好的,我将字符串拆分为包含 3 个元素的 String[] 对象... :oai-identifier="openarchives.org/OAI/2.0/oai-identifier" :mingo-identifier="google.com" :abeve- identifier="news.ycombinator.org/OAI/2.0/oai-identifier"></feed> 现在我只想获取 "" 之间的内容并将该信息添加到数组中,对吗?
  • 是的,您可以循环遍历数组来执行此操作。但是,如果您正在考虑除此之外进行更多的 XML 解析,那么您应该考虑@helderdaroch 的答案中概述的方法。
【解决方案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);

【讨论】:

  • 最终使用了 ArrayList namespaces = new ArrayList(); String[] splits = xml.split("xmlns"); for(int s = 1; s
【解决方案3】:

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

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
Document doc = factory.newDocumentBuilder().parse(new InputSource(new StringReader(validXML)));

String namespace = doc.lookupNamespaceURI("oai-identifier");

更简单,你不必做任何字符串解析。

【讨论】:

  • 这绝对是比使用定制正则表达式更好的方法。
猜你喜欢
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多