使用java中的regex从无效/部分xml中提取值

时间:2013-11-14 09:23:08

标签: java xml regex

我有一个像这样的xml,它是直接从数据库获得的(它不需要是一个有正确的开放和结束标记的有效的。)我需要从这个xml中获取数据,例如。颜色,级别,前缀等。由于不能保证正确的xml格式,我这样做的唯一方法是Regex ..或者是它?

xml看起来像这样

<indicator label_unit_en="Index points" label_unit_de="Basis punkte">  
<partition id="P_ABC_DEF.3">    
<part color="darkgreen"   level="50"    prefix_en="aaa 111"   prefix_de="unt ü 50">    
<part color="lightgreen"  level="100"   prefix_en="50 to 100"  prefix_de="qwe 100">    
<part color="lightorange" level="200"   prefix_en="100 to 200" prefix_de="100 qw 200">    
<part color="darkorange"  level="300"   prefix_en="200 to 300" prefix_de="20 w0">    
<part color="lightred"    level="500"   prefix_en="300 to 500" prefix_de="rr 0">    
part color="darkred"     level="99999" prefix_en="above 500"  prefix_de="ü 2">  
</partition>
</indicator>

任何人都可以建议我从这个xml中提取数据吗???

我可以从中提取数据 color(color=\"(\\w+?)\"), level(level=\"(\\w+?)\),但不是其他人。

我创建的任何匹配器都找不到prefix_en,prefix_de, label_unit_en, label_unit_de

的任何内容

请为此建议解决方案。或者除了正则表达式之外还有什么方法可以解决这个问题。

2 个答案:

答案 0 :(得分:2)

也许,可以使用http://jtidy.sourceforge.net/之类的库将初始XML转换为格式良好,然后使用xPath或节点扫描提取数据。

答案 1 :(得分:0)

您粘贴的代码需要大量格式才能被视为xml:

<?xml version="1.0" ?> 
<indicator label_unit_en="Index points" label_unit_de="Basis punkte">  
<partition id="P_ABC_DEF.3">    
<part color="darkgreen"   level="50"    prefix_en="aaa 111"   prefix_de="unt ü 50"/>    
<part color="lightgreen"  level="100"   prefix_en="50 to 100"  prefix_de="qwe 100"/>    
<part color="lightorange" level="200"   prefix_en="100 to 200" prefix_de="100 qw 200"/>    
<part color="darkorange"  level="300"   prefix_en="200 to 300" prefix_de="20 w0"/>    
<part color="lightred"    level="500"   prefix_en="300 to 500" prefix_de="rr 0"/>    
<part color="darkred"     level="99999" prefix_en="above 500"  prefix_de="ü 2"/>  
</partition>
</indicator>

如果将其格式化为pasle701消化的xml,则可以获取值,否则可以对此进行字符串操作:

    String result = "<indicator label_unit_en=\"Index points\" label_unit_de=\"Basis punkte\">"+  
              "<partition id=\"P_ABC_DEF.3\">"+    
              "<part color=\"darkgreen\"   level=\"50\"    prefix_en=\"aaa 111\"   prefix_de=\"unt ü 50\">"+    
              "<part color=\"lightgreen\"  level=\"100\"   prefix_en=\"50 to 100\"  prefix_de=\"qwe 100\">"+    
              "<part color=\"lightorange\" level=\"200\"   prefix_en=\"100 to 200\" prefix_de=\"100 qw 200\">"+           
              "</partition>"+
              "</indicator>";

System.out.println(x.substring(x.indexOf("color=")+7,x.indexOf(" ", x.indexOf("color="))-1));

告诉我们你想要什么,并相应地提供帮助。