鉴于以下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 ListlistDataElements(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; }
如何将我的正则表达式更改为仅包含数据元素并忽略其余部分?
XML不是常规语言.您无法使用正则表达式解析它.当你得到嵌套标签时,你认为可以使用的表达式会破坏,然后当你修复它时会破坏XML注释,然后是CDATA部分,然后是处理器指令,然后命名空间,......它无法工作,使用XML解析器.
这应该在Java中工作,如果您可以假设在DataElements标记之间,所有内容都具有表单值.即没有属性,也没有嵌套元素.
Pattern regex = Pattern.compile("(.*?) ", Pattern.DOTALL); Matcher matcher = regex.matcher(subjectString); Pattern regex2 = Pattern.compile("<([^<>]+)>([^<>]+)\\1>"); 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))); } }