正则表达式,用于检索xml的子标记,而不管其位置如何

时间:2013-04-02 23:57:06

标签: xml regex

使用分组表达式检索标记的子标记(ASObject)内容之一的正则表达式是什么,而不管下面xml中子标记的位置如何。它可以是第一个或第二个。但我想检索具有“postinjr”工资源代码的ASObject,而不管其位置如何。您可以在此处向我提供解决方案...... http://gskinner.com/RegExr/?2usad

<insuredwages>
    <ASObject mappedClass="com.taliantsoftware.claims.wages.InsuredWagesDTO" encoding="0">
        <wagescategorytypecode tagClass="String">postinjr</wagescategorytypecode>
        <agreementid tagClass="double">2654630.0</agreementid>
        <jobtitle tagClass="String">Worker</jobtitle>
        <createddatetime tagClass="Date">2012-10-01 13:28:05.213 CDT</createddatetime>
        <new tagClass="boolean">false</new>
        <employmentstatustypename tagClass="String">Disabled</employmentstatustypename>
        <updated tagClass="boolean">false</updated>
        <voided tagClass="boolean">false</voided>
        <wagescategorytypename tagClass="String">Post Injury</wagescategorytypename>
        <employmentstatustypecode tagClass="String">dsabld</employmentstatustypecode>
        <useridcreated tagClass="double">111.0</useridcreated>
        <userupdated tagClass="String"/>
        <recordid tagClass="double">1030237.0</recordid>
        <usercreated tagClass="String">TESTER QA</usercreated>
    </ASObject>
    <ASObject mappedClass="com.taliantsoftware.claims.wages.InsuredWagesDTO" encoding="0">
        <agreementid tagClass="double">2654630.0</agreementid>
        <wagescategorytypecode tagClass="String">preinjr</wagescategorytypecode>
        <createddatetime tagClass="Date">2012-10-01 13:28:00.291 CDT</createddatetime>
        <new tagClass="boolean">false</new>
        <updateddatetime tagClass="Date">2012-10-01 13:28:00.291 CDT</updateddatetime>
        <updated tagClass="boolean">false</updated>
        <voided tagClass="boolean">false</voided>
        <wagescategorytypename tagClass="String">Pre-Injury</wagescategorytypename>
        <useridcreated tagClass="double">111.0</useridcreated>
        <userupdated tagClass="String">TESTER QA</userupdated>
        <useridupdated tagClass="double">111.0</useridupdated>
        <recordid tagClass="double">1036667.0</recordid>
        <usercreated tagClass="String">TESTER QA</usercreated>
    </ASObject>
</insuredwages>

2 个答案:

答案 0 :(得分:1)

你没有。正则表达式完全不适合这项任务。使用专为此工作而设计的XPath。

有关原因的解释,请参阅RegEx match open tags except XHTML self-contained tags - StackOverflow经典。

答案 1 :(得分:0)

这将获取整个条目;

/<ASObject.*?>postinjr</wagescategorytypecode>.*?</ASObject>/gs

..但强烈建议使用XML解析器来正确处理数据。

以下是RegExr的链接:http://regexr.com?34cfg

这只会获取它的内部(没有<ASObject> ... </ASObject>);

/<ASObject.*?>(.*?>postinjr</wagescategorytypecode>.*?)</ASObject>/gs

..并获取第1组($1); http://regexr.com?34cfj

您应该对获取的内容执行另一个RegEx,以分隔您已获得的子项。使情境RegEx基于该内部值精确获取数据并按组分开项目将非常混乱。

这是获取内部项目的一个非常原始的开始,但它只会降低一个级别而不会处理转义斜杠和(< / >/);

/<.*?>(.*?)</.*?>/gs

http://regexr.com?34cfm

如果你真的想在一个RegEx中做所有事情,你应该研究断言;

  • ?= Lookahead断言
  • ?!否定前瞻
  • ?<= Lookbehind断言
  • ?!=负面观察(或?<!
  • ?>一次性Subexpression
  • ?()条件[if then]
  • ?()|条件[if then else]
  • ?#评论

我会离开,这一切是如何运作的,给你研究;)