当前位置:  开发笔记 > 编程语言 > 正文

使用Java中的REGEX解析XML

如何解决《使用Java中的REGEX解析XML》经验,为你挑选了2个好方法。

鉴于以下XML代码段,我需要获取DataElements下每个子项的名称/值对列表.XPath或XML解析器不能用于我无法控制的原因,因此我正在使用正则表达式.



  
    2.0
    95465.00
    11.A
    13
  
  
    92f4-MPA
    7.19879
  

我需要的输出是:[{EmpStatus:2.0},{支出:95465.00},{StaffType:11.A},{Industry:13}]

DataElements下的标记名称是动态的,因此无法在正则表达式中按字面表示.标签名称TargetCenter和Trace是静态的,可以在正则表达式中,但如果有办法避免硬编码,那将是更好的选择.

"<([A-Za-z0-9]+?)>([A-Za-z0-9.]*?)

这是我构造的正则表达式,它的问题是它在结果中错误地包含{Trace:719879}.依赖于XML中的换行或任何其他明显的格式不是一种选择.

下面是我正在使用的Java代码的近似值:

private static final Pattern PATTERN_1 = Pattern.compile(..REGEX..);
private List listDataElements(CharSequence cs) {
    List list = new ArrayList();
    Matcher matcher = PATTERN_1.matcher(cs);
    while (matcher.find()) {
        list.add(new DataElement(matcher.group(1), matcher.group(2)));
    }
    return list;
}

如何将我的正则表达式更改为仅包含数据元素并忽略其余部分?



1> Dour High Ar..:

XML不是常规语言.您无法使用正则表达式解析它.当你得到嵌套标签时,你认为可以使用的表达式会破坏,然后当你修复它时会破坏XML注释,然后是CDATA部分,然后是处理器指令,然后命名空间,......它无法工作,使用XML解析器.


不,我正在给出正确的语法无法表达无上下文语法的正确信息,这在数学上是不可能的.请阅读http://en.wikipedia.org/wiki/Chomsky_hierarchy.
让所有人都同意这是一个坏主意,它会以泪水结束并成为老鼠的巢穴.但是为了给那些可能在以后看到这个答案的人提供透视并认为它是正确的:用XML解析器解析(例如)PNG文件是不可能的,用正则表达式解析一些XML只是不明智.
使用正则表达式解析XML总是以泪流满面.
最重要的是,"简单而可靠"的xml在某些时候会发生变化.当它发生变化时,您的轻量级解析器将失败,您将回到现在的位置.您将尝试修复您的解析器,但它很快就会成为一个难以理解的老鼠窝.
我怀疑你提供的错误信息断言正则表达式不能用于轻量级解析简单可靠的子集xml.

2> Jan Goyvaert..:

这应该在Java中工作,如果您可以假设在DataElements标记之间,所有内容都具有表单值.即没有属性,也没有嵌套元素.

Pattern regex = Pattern.compile("(.*?)", Pattern.DOTALL);
Matcher matcher = regex.matcher(subjectString);
Pattern regex2 = Pattern.compile("<([^<>]+)>([^<>]+)");
if (matcher.find()) {
    String DataElements = matcher.group(1);
    Matcher matcher2 = regex2.matcher(DataElements);
    while (matcher2.find()) {
        list.add(new DataElement(matcher2.group(1), matcher2.group(2)));
    } 
}

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有