Как получить и проанализировать файл XML с помощью AppleScript? - PullRequest
6 голосов
/ 02 сентября 2011

На некотором удаленном сервере есть файл XML (http://foo/bar.xml):

<?xml version="1.0" encoding="UTF-8"?> 
<foo> 
  bar
</foo>

Как я могу получить значение "bar", используя AppleScript?

Ответы [ 3 ]

4 голосов
/ 02 сентября 2011

Вот что я сделал:

set file_tgt to (POSIX path of (path to temporary items)) & "file.xml"
    do shell script "curl -L " & "http://url.com/file.xml" & " -o " & file_tgt
tell application "System Events"
    set file_content to contents of XML file file_tgt
    tell file_content
        set my_value to value of XML element 1
    end tell
end tell

Первоначально я использовал приложение "URL Access Scripting" для извлечения файла, но поскольку он был удален в Lion, я переключился на чистый curl, который работает как в Snow Leopard, так и в Lion.

2 голосов
/ 02 сентября 2011

Я нашел этот поток , в котором есть пример синтаксического анализа файла XML с помощью инструментов XML, доступных через системные события. Мне это кажется довольно запутанным.

Также есть (бесплатная) пакет дополнений для скриптинга для анализа / записи XML. Не смотрел на это, но это может быть аккуратно.

Лично я бы сохранил свой сценарий как набор сценариев, а затем я бы сделал небольшой скрипт php / Ruby / perl / python / любой другой для анализа XML (так как мне это более удобно) в расслоение. Затем я использую AppleScript, а затем передаю XML в скрипт синтаксического анализа из cURL.

AppleScript:

set scriptPath to POSIX path of (path to me as alias) & "Contents/Resources/parse_xml.rb"
set fooValue to do shell script "curl http://foo/test.xml 2> /dev/null | ruby " & quoted form of scriptPath

parse_xml.rb может выглядеть примерно так (на примере Ruby):

require "rexml/document"

# load and parse the xml from stdin
xml = STDIN.read
doc = REXML::Document.new(xml)

# output the text of the root element (<foo>) stripped of leading/trailing whitespace
puts doc.root.text.strip

(Ruby и пакет REXML должны быть легко доступны на любом Mac, поэтому он должен работать где угодно… я считаю)

Дело в том, что при запуске скрипта он загружает XML-файл с помощью cURL, передает его в скрипт Ruby, и в конце fooValue в AppleScript будет установлен на "bar".

Конечно, если XML более сложный, вам потребуется больше сценариев или другой взгляд на другие варианты.

Возможно, есть даже больше способов сделать это (например, вы могли бы просто выполнить некоторые манипуляции со строками вместо полного разбора XML, но это, конечно, немного хрупко), но я остановлюсь здесь:)

0 голосов
/ 19 декабря 2014

Понимание того, что это старый вопрос, но вот один из способов использования API Карт Bing (заметьте, я заменил свой ключ API на XXXXXXXXXX).используйте do shell script с curl для извлечения XML, затем просто переходите по элементам, пока не дойдете до того, который вам нужен (вы можете объединить все tell с в tell xml element “X” of xml element “y” of xml element…, но за этим проще следовать).

set theXML to make new XML data with properties {name:"Geolocation", text:(do shell script "curl 'http://dev.virtualearth.net/REST/v1/Locations?&q=638%20Brandon%20Town%20Center%20Brandon%20FL%2033511&o=xml&key=XXXXXXXXXX'")}
tell theXML
    tell XML element "Response"
        tell XML element "ResourceSets"
            tell XML element "ResourceSet"
                tell XML element "Resources"
                    tell XML element "Location"
                        tell XML element "Point"
                            set theLatitude to the value of XML element "Latitude"
                            set theLongitude to the value of XML element "Longitude"
                        end tell
                    end tell
                end tell
            end tell
        end tell
    end tell
end tell

РЕДАКТИРОВАТЬ: Я полагаю, я должен включить XML, который я использовал для выше:

<?xml version=\"1.0\" encoding=\"utf-8\"?>
<Response xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.microsoft.com/search/local/ws/rest/v1\">
  <Copyright>Copyright © 2014 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.</Copyright>
  <BrandLogoUri>http://dev.virtualearth.net/Branding/logo_powered_by.png</BrandLogoUri>
  <StatusCode>200</StatusCode>
  <StatusDescription>OK</StatusDescription>
  <AuthenticationResultCode>ValidCredentials</AuthenticationResultCode>
  <TraceId>06bb657f1ac9466ba00ef45aa55aef3b|BN20130631|02.00.108.1000|BN2SCH020180822, BN2SCH020181444, BN2SCH020181020, BN2SCH030291220, BN2SCH030261523</TraceId>
  <ResourceSets>
    <ResourceSet>
      <EstimatedTotal>1</EstimatedTotal>
      <Resources>
        <Location>
          <Name>638 Brandon Town Center Dr, Brandon, FL 33511</Name>
          <Point>
            <Latitude>27.929752349853516</Latitude>
            <Longitude>-82.326362609863281</Longitude>
          </Point>
          <BoundingBox>
            <SouthLatitude>27.925889632282839</SouthLatitude>
            <WestLongitude>-82.332191670122214</WestLongitude>
            <NorthLatitude>27.933615067424192</NorthLatitude>
            <EastLongitude>-82.320533549604349</EastLongitude>
          </BoundingBox>
          <EntityType>Address</EntityType>
          <Address>
          <AddressLine>638 Brandon Town Center Dr</AddressLine>
          <AdminDistrict>FL</AdminDistrict>
          <AdminDistrict2>Hillsborough Co.</AdminDistrict2>
          <CountryRegion>United States</CountryRegion>
          <FormattedAddress>638 Brandon Town Center Dr, Brandon, FL 33511</FormattedAddress>
          <Locality>Brandon</Locality>
          <PostalCode>33511</PostalCode>
          </Address>
          <Confidence>High</Confidence>
          <MatchCode>Good</MatchCode>
          <GeocodePoint>
            <Latitude>27.929752349853516</Latitude>
            <Longitude>-82.326362609863281</Longitude>
            <CalculationMethod>Parcel</CalculationMethod>
            <UsageType>Display</UsageType>
          </GeocodePoint>
          <GeocodePoint>
            <Latitude>27.929159164428711</Latitude>
            <Longitude>-82.32720947265625</Longitude>
            <CalculationMethod>Interpolation</CalculationMethod>
            <UsageType>Route</UsageType>
          </GeocodePoint>
        </Location>
      </Resources>
    </ResourceSet>
  </ResourceSets>
</Response>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...