Search code examples
scalaamazon-web-servicesscala-xml

Parsing xml with scala


I'm trying to parse the xml response from AWIS(alexa rest apis from amazon) api's with scala.xml.XML without any success.

XML Response:

<?xml version="1.0"?>
<aws:TrafficHistoryResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/"><aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11"><aws:OperationRequest><aws:RequestId>aef82596-5d7b-c72a-b97c-f31de4aedcf5</aws:RequestId></aws:OperationRequest><aws:TrafficHistoryResult><aws:Alexa>

  <aws:TrafficHistory>
    <aws:Range>7</aws:Range>
    <aws:Site>yahoo.com</aws:Site>
    <aws:Start>2015-10-30</aws:Start>
    <aws:HistoricalData>
      <aws:Data>
        <aws:Date>2015-10-30</aws:Date>
        <aws:PageViews>
          <aws:PerMillion>10800</aws:PerMillion>
          <aws:PerUser>7.33</aws:PerUser>
        </aws:PageViews>
        <aws:Rank>5</aws:Rank>
        <aws:Reach>
          <aws:PerMillion>130500</aws:PerMillion>
        </aws:Reach>
      </aws:Data>
      <aws:Data>
        <aws:Date>2015-10-31</aws:Date>
        <aws:PageViews>
          <aws:PerMillion>10790</aws:PerMillion>
          <aws:PerUser>6.85</aws:PerUser>
        </aws:PageViews>
        <aws:Rank>5</aws:Rank>
        <aws:Reach>
          <aws:PerMillion>129100</aws:PerMillion>
        </aws:Reach>
      </aws:Data>
      <aws:Data>
        <aws:Date>2015-11-01</aws:Date>
        <aws:PageViews>
          <aws:PerMillion>10960</aws:PerMillion>
          <aws:PerUser>6.84</aws:PerUser>
        </aws:PageViews>
        <aws:Rank>5</aws:Rank>
        <aws:Reach>
          <aws:PerMillion>132500</aws:PerMillion>
        </aws:Reach>
      </aws:Data>
      <aws:Data>
        <aws:Date>2015-11-02</aws:Date>
        <aws:PageViews>
          <aws:PerMillion>11180</aws:PerMillion>
          <aws:PerUser>7.57</aws:PerUser>
        </aws:PageViews>
        <aws:Rank>5</aws:Rank>
        <aws:Reach>
          <aws:PerMillion>134800</aws:PerMillion>
        </aws:Reach>
      </aws:Data>
      <aws:Data>
        <aws:Date>2015-11-03</aws:Date>
        <aws:PageViews>
          <aws:PerMillion>11290</aws:PerMillion>
          <aws:PerUser>7.70</aws:PerUser>
        </aws:PageViews>
        <aws:Rank>5</aws:Rank>
        <aws:Reach>
          <aws:PerMillion>133900</aws:PerMillion>
        </aws:Reach>
      </aws:Data>
      <aws:Data>
        <aws:Date>2015-11-04</aws:Date>
        <aws:PageViews>
          <aws:PerMillion>11310</aws:PerMillion>
          <aws:PerUser>7.76</aws:PerUser>
        </aws:PageViews>
        <aws:Rank>5</aws:Rank>
        <aws:Reach>
          <aws:PerMillion>133400</aws:PerMillion>
        </aws:Reach>
      </aws:Data>
      <aws:Data>
        <aws:Date>2015-11-05</aws:Date>
        <aws:PageViews>
          <aws:PerMillion>11430</aws:PerMillion>
          <aws:PerUser>7.74</aws:PerUser>
        </aws:PageViews>
        <aws:Rank>5</aws:Rank>
        <aws:Reach>
          <aws:PerMillion>133300</aws:PerMillion>
        </aws:Reach>
      </aws:Data>
    </aws:HistoricalData>
  </aws:TrafficHistory>
</aws:Alexa></aws:TrafficHistoryResult><aws:ResponseStatus xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/"><aws:StatusCode>Success</aws:StatusCode></aws:ResponseStatus></aws:Response></aws:TrafficHistoryResponse>

The processing code:

val xml = XML.loadString(response.body)
val response = xml \ "aws:Response"
val data = xml \\ "aws:Data"

both response and data returns empty nodesequences. I'm figuring this might have to do with the namespacing.

Any pointers as to how to tackle this issue would be greatly appreciated. TIA


Solution

  • Try to request elements without namespaces specified:

    val response = xml \ "Response"
    val data = xml \\ "Data"