【问题标题】:Parse Text Using Delimiters使用分隔符解析文本
【发布时间】:2014-06-12 22:55:55
【问题描述】:

我试图弄清楚如何从 MySQL 的字段中解析出 URL(一个 VAST 视频标签)。 此字段包含多行不同但应包含相同的 XML 代码。

这是我要解析的 URL:

http://ad.amgdgt.com/ads/?t=dr&f=vast2&p=10582&pl=a75d1869&rnd=<timestamp>

这是整个字段:

<?xml version="1.0" encoding="utf-8"?> <VAST xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> <Ad id="000000"> <Wrapper> <AdSystem version="2.0">DINVICO</AdSystem> <VASTAdTagURI><![CDATA[http://ad.amgdgt.com/ads/?t=dr&f=vast2&p=10582&pl=a75d1869&rnd=<timestamp>]]></VASTAdTagURI> <Impression><![CDATA[<ditu>]]></Impression> <Impression><![CDATA[<comscoreVOX>]]></Impression> <Impression><![CDATA[<comscoreVideo>]]></Impression> <Creatives> <Creative AdID="000000" id="000000" sequence="1"> <Linear> <TrackingEvents> <Tracking event="start"><![CDATA[<event_12>]]></Tracking> <Tracking event="firstQuartile"><![CDATA[<event_13>]]></Tracking> <Tracking event="midpoint"><![CDATA[<event_14>]]></Tracking> <Tracking event="thirdQuartile"><![CDATA[<event_15>]]></Tracking> <Tracking event="complete"><![CDATA[<event_16>]]></Tracking> <Tracking event="mute"><![CDATA[<event_17>]]></Tracking> <Tracking event="unmute"><![CDATA[<event_18>]]></Tracking> <Tracking event="rewind"><![CDATA[<event_20>]]></Tracking> <Tracking event="resume"><![CDATA[<event_21>]]></Tracking> <Tracking event="expand"><![CDATA[<event_23>]]></Tracking> <Tracking event="collapse"><![CDATA[<event_24>]]></Tracking> <Tracking event="acceptInvitation"><![CDATA[<event_26>]]></Tracking> <Tracking event="pause"><![CDATA[<event_19>]]></Tracking> <Tracking event="fullscreen"><![CDATA[<event_22>]]></Tracking> <Tracking event="close"><![CDATA[<event_27>]]></Tracking> <Tracking event="creativeView"><![CDATA[<event_11>]]></Tracking> </TrackingEvents> <VideoClicks> <ClickTracking><![CDATA[<click_tag>]]></ClickTracking> </VideoClicks> </Linear> </Creative> </Creatives> <Extensions> </Extensions> </Wrapper> </Ad> </VAST>

如您所见,HTML 链接由&lt;VASTAdTagURI&gt;&lt;![CDATA[ ... ]]&gt;&lt;/VASTAdTagURI&gt; 分隔

如何告诉 MySQL 只选择并返回两个分隔符内的 HTML 链接?

这是我目前正在使用的返回整个 XML 代码的 SQL:

select
a.name as Advertiser_Name,
a.aid as Advertiser_ID,
b.name as Creative_Name,
b.id_creative as Creative_ID,
bt.tag as XML_Code,
bt.tag_secure as XML_Code_Secure

from advertisers a
inner join campaigns c on c.aid=a.aid
inner join banners b on b.cid=c.cid
inner join banner_tags bt on bt.bid=b.bid
inner join placement p on p.cid=c.cid
inner join locations l on l.lid=p.lid
inner join sites s on s.sid=l.sid

where s.pid='<Partner_ID>' and b.status=1 and c.status in (-1,0,1,2)

group by b.id_creative

order by b.status

【问题讨论】:

    标签: mysql parsing delimiter vast


    【解决方案1】:

    将 XPath 与 ExtractValue() 一起使用:

    SELECT ExtractValue(col, '/VAST/Ad/Wrapper/VASTAdTagURI/text()');
    

    【讨论】:

    • 感谢您的回答。我对诸如 ExtractValue() 之类的高级查询有些陌生。如果我提供我的查询,您能否建议我应该如何实施?
    • @user3735875 好吧,这只是一个涉及函数调用的列表达式。只需将 ExtractValue(XML_Code, '/VAST/Ad/Wrapper/VASTAdTagURI/text()') AS Url 作为您选择的列之一即可。
    • 当我尝试这个时,MySQL返回错误“FUNCTION database.ExtractValue不存在”这是否意味着我需要添加这个功能?
    • @user3735875 ExtractValue() 从 5.1.5 开始可用,所以如果你有一个超级旧版本的 MySQL,你就不走运了,你必须求助于下面的 @Fabricator 的方法。跨度>
    • 使用 Query Browser 1.2.17,我可以更新吗?
    【解决方案2】:

    不知道ExtractValue 方法。这是一种获取它的愚蠢方法(使用LOCATESUBSTR

    SET @s:='<?xml version="1.0" encoding="utf-8"?> <VAST xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"> <Ad id="000000"> <Wrapper> <AdSystem version="2.0">DINVICO</AdSystem> <VASTAdTagURI><![CDATA[http://ad.amgdgt.com/ads/?t=dr&f=vast2&p=10582&pl=a75d1869&rnd=<timestamp>]]></VASTAdTagURI> <Impression><![CDATA[<ditu>]]></Impression> <Impression><![CDATA[<comscoreVOX>]]></Impression> <Impression><![CDATA[<comscoreVideo>]]></Impression> <Creatives> <Creative AdID="000000" id="000000" sequence="1"> <Linear> <TrackingEvents> <Tracking event="start"><![CDATA[<event_12>]]></Tracking> <Tracking event="firstQuartile"><![CDATA[<event_13>]]></Tracking> <Tracking event="midpoint"><![CDATA[<event_14>]]></Tracking> <Tracking event="thirdQuartile"><![CDATA[<event_15>]]></Tracking> <Tracking event="complete"><![CDATA[<event_16>]]></Tracking> <Tracking event="mute"><![CDATA[<event_17>]]></Tracking> <Tracking event="unmute"><![CDATA[<event_18>]]></Tracking> <Tracking event="rewind"><![CDATA[<event_20>]]></Tracking> <Tracking event="resume"><![CDATA[<event_21>]]></Tracking> <Tracking event="expand"><![CDATA[<event_23>]]></Tracking> <Tracking event="collapse"><![CDATA[<event_24>]]></Tracking> <Tracking event="acceptInvitation"><![CDATA[<event_26>]]></Tracking> <Tracking event="pause"><![CDATA[<event_19>]]></Tracking> <Tracking event="fullscreen"><![CDATA[<event_22>]]></Tracking> <Tracking event="close"><![CDATA[<event_27>]]></Tracking> <Tracking event="creativeView"><![CDATA[<event_11>]]></Tracking> </TrackingEvents> <VideoClicks> <ClickTracking><![CDATA[<click_tag>]]></ClickTracking> </VideoClicks> </Linear> </Creative> </Creatives> <Extensions> </Extensions> </Wrapper> </Ad> </VAST>';
    SELECT LOCATE('<VASTAdTagURI><![CDATA[', @s)+LENGTH('<VASTAdTagURI><![CDATA[') start_pos,  
           LOCATE(']]></VASTAdTagURI>', @s, LOCATE('<VASTAdTagURI><![CDATA[', @s)) end_pos,
           LOCATE(']]></VASTAdTagURI>', @s, LOCATE('<VASTAdTagURI><![CDATA[', @s)) - (LOCATE('<VASTAdTagURI><![CDATA[', @s)+LENGTH('<VASTAdTagURI><![CDATA[')) len,
           SUBSTR(@s, 
                  LOCATE('<VASTAdTagURI><![CDATA[', @s)+LENGTH('<VASTAdTagURI><![CDATA['), 
                  LOCATE(']]></VASTAdTagURI>', @s, LOCATE('<VASTAdTagURI><![CDATA[', @s)) - (LOCATE('<VASTAdTagURI><![CDATA[', @s)+LENGTH('<VASTAdTagURI><![CDATA['))) url;
    

    【讨论】:

    • 谢谢你的回答,看起来它使用了分隔符,但看起来它只适用于一行 XML 代码?有没有办法可以将其应用于不同的 XML 代码列表?您能否建议我如何使用我刚刚添加到原始问题中的查询来实现这一点?
    猜你喜欢
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多