匹配XML数据中的特定CDATA部分

时间:2015-07-18 06:40:33

标签: regex xml powershell powershell-v3.0 cdata

我正在尝试使用PowerShell正则表达式,我有以下页面(下面是下面的)我想要进行匹配,粗体的两个部分是我想要捕获并分配给变量的信息。所以我需要两个正则表达式。从下面的文字中,我需要找到的两个区域是 King 年&年即可。请注意,这两个区域会发生变化(因此我需要捕获它们),其余的代码保持不变。

这是我目前的正则表达式,但它不适合我。

\s+artist\s*>\s*<\s*!\s*[CDATA\s*[(.*)\s*]\s*]\s*>\s*<\s*/artist

这是我尝试使用正则表达式的页面(或数据)。

<on_air>
  <publishedInfo publishedDate="2015-07-18 16:24:28" />
  <stationName><![CDATA[Mix 106.5]]></stationName>
  <stationPrefix><![CDATA[mix1065]]></stationPrefix>
  <generic_coverart><![CDATA[http://media.arn.com.au/images/getImage.aspx?i=generic_mix1065.jpg]]></generic_coverart>
  <now_playing>
    <audio ID="id_1705168034_30458146" type="song">
      <title generic="False"><![CDATA[King*]]></title>
      <artist><![CDATA[Years & Years]]></artist>
      <number><![CDATA[46029]]></number>
      <cut><![CDATA[1]]></cut>
      <ref><![CDATA[]]></ref>
      <played_datetime><![CDATA[2015-07-18 16:24:27]]></played_datetime>
      <length><![CDATA[00:03:28]]></length>
      <coverart generic="true"><![CDATA[http://media.arn.com.au/images/getImage.aspx?i=generic_mix1065.jpg]]></coverart>
      <options>
        <option><![CDATA[KIIS S Integrated]]></option>
      </options>
    </audio>
  </now_playing>

3 个答案:

答案 0 :(得分:4)

如果它是有效的XML,那么您不需要使用正则表达式。 PowerShell可以调整XML对象,您可以使用标准属性语法来导航它们:

$xml=[xml]@'
<on_air>
  <publishedInfo publishedDate="2015-07-18 16:24:28" />
  <stationName><![CDATA[Mix 106.5]]></stationName>
  <stationPrefix><![CDATA[mix1065]]></stationPrefix>
  <generic_coverart><![CDATA[http://media.arn.com.au/images/getImage.aspx?i=generic_mix1065.jpg]]></generic_coverart>
  <now_playing>
    <audio ID="id_1705168034_30458146" type="song">
      <title generic="False"><![CDATA[King*]]></title>
      <artist><![CDATA[Years & Years]]></artist>
      <number><![CDATA[46029]]></number>
      <cut><![CDATA[1]]></cut>
      <ref><![CDATA[]]></ref>
      <played_datetime><![CDATA[2015-07-18 16:24:27]]></played_datetime>
      <length><![CDATA[00:03:28]]></length>
      <coverart generic="true"><![CDATA[http://media.arn.com.au/images/getImage.aspx?i=generic_mix1065.jpg]]></coverart>
      <options>
        <option><![CDATA[KIIS S Integrated]]></option>
      </options>
    </audio>
  </now_playing>
</on_air>
'@
$xml.on_air.now_playing.audio.title.'#cdata-section'
$xml.on_air.now_playing.audio.artist.'#cdata-section'

答案 1 :(得分:1)

您想要转义括号文字。

此外,避免使用点&#34;匹配几乎任何角色都是一种很好的做法。当您的意图更具体时,元字符。在你的情况下,你真正想要做的是匹配,直到你达到结束括号,所以更明智地指定:

'\s+artist\s*>\s*<\s*!\s*\[CDATA\s*\[([^]]*)\s*\]\s*\]\s*>\s*<\s*\/artist'

注意:正则表达式是上下文的,所以我不必转义字符类中的右括号是因为它的位置,即在否定类中指定的第一个字符 - 在该上下文中,它不能是字符类的结束括号。换句话说,它并不含糊。

答案 2 :(得分:0)

为了帮助您起步,这里有一个关于y&amp; y的建议(尽可能插入空白选择器):

artist><!\[CDATA\[Years & Years\]\]></artist