Applescript-синтаксический анализ XML
Я пытаюсь создать Applescript, чтобы извлечь значение из .xfdf
XFDF
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<annots>
<square color="#FF0000" creationdate="D:20130828114843+05'30'" date="D:20130828114901+05'30'" flags="print" name="Xi6cOkAWgWHcAhpfBkR5A7" page="0" rect="347.7599999991828,1041.8400000004283,453.5999999989341,1056.9600000003927" subject="Rectangle" title="1 im, awltest7 (AWLTEST7.IM)">
<contents-richtext>
<body>
<p>Text Not Clear</p>
</body>
</contents-richtext>
<popup open="yes" page="0" rect="453.5999999989341,944.4600000003926,573.5999999989341,1056.9600000003927" />
</square>
<square color="#FF0000" creationdate="D:20130828114910+05'30'" date="D:20130828114919+05'30'" flags="print" name="ptmmBKtfoDEbVzirMgZLnY" page="0" rect="511.1999999987987,1092.960000000308,550.7999999987057,1123.9200000002352" subject="Rectangle" title="2 im, awltest7 (AWLTEST7.IM)">
<contents-richtext>
<body>
<p>Incorrect dimension</p>
</body>
</contents-richtext>
<popup open="yes" page="0" rect="550.7999999987057,1011.4200000002352,670.7999999987056,1123.9200000002352" />
</square>
<square color="#FF0000" creationdate="D:20130828114956+05'30'" date="D:20130828115004+05'30'" flags="print" name="8LaAl2Upx4LEaQptQKXoZx" page="0" rect="355.67999999916424,731.5200000011573,431.99999999898483,750.2400000011135" subject="Rectangle" title="3 im, awltest7 (AWLTEST7.IM)">
<contents-richtext>
<body>
<p>Incorrect Text</p>
</body>
</contents-richtext>
<popup open="yes" page="0" rect="431.99999999898483,637.7400000011133,551.9999999989849,750.2400000011135" />
</square>
</annots>
</xfdf>
Applescript
set theXMLFile to ((choose file) as string)
tell application "System Events"
tell XML element "xfdf" of contents of XML file theXMLFile
set typeText to (value of XML element "p")
set nameText to (value of XML element "p")
end tell
end tell
При запуске скрипта я получаю такую ошибку: системные события получили ошибку: не удается получить XML-элемент "p" XML-элемента "xfdf" содержимого XML-файла . Есть ли где-нибудь, где я могу извлечь эти значения из XML. Значение для извлечения "всплывающее окно", "p" .
Edit
set theXMLFile to ((choose file) as string)
tell application "System Events"
set theXMLFile to XML file theXMLFile
set loops to XML elements of XML element "annots" of XML element "xfdf" of theXMLFile whose name is "square"
set coor to {}
repeat with i from 1 to (count loops)
--set end of p to value of XML element "square" of XML element "body" of XML element "contents-richtext" of item i of squares
set end of coor to value of XML attributes of XML element "square" of item i of loops
end repeat
end tell
squares
2 ответов:
Вы прямо спрашиваете элемент
xfdfдляp, ноxfdfне является его родителем. Чтобы добраться до него, нужно углубиться в иерархию.set theXMLFile to ((choose file) as string) tell application "System Events" set theXMLFile to XML file theXMLFile set squares to XML elements of XML element "annots" of XML element "xfdf" of theXMLFile whose name is "square" set p to {} set attrs to {} repeat with i from 1 to (count squares) set end of p to value of XML element "p" of XML element "body" of XML element "contents-richtext" of item i of squares set end of attrs to value of XML attributes of XML element "popup" of item i of squares end repeat end tell p --> {"Text Not Clear", "Incorrect dimension", "Incorrect Text"} attrs --> {{"yes", "0", "453.5999999989341,944.4600000003926,573.5999999989341,1056.9600000003927"}, {"yes", "0", "550.7999999987057,1011.4200000002352,670.7999999987056,1123.9200000002352"}, {"yes", "0", "431.99999999898483,637.7400000011133,551.9999999989849,750.2400000011135"}}Другой вариант-использоватьXML Tools Scripting Addition из Late Night Software.
Я написал рекурсивную вспомогательную функцию, которая может решить эту проблему.
Он ищет в xml определенное имя и возвращает список XML-элементов, которые вы можете затем перебрать, чтобы получить свои значения.
Преимущество этого заключается в том, что вам не нужно заранее знать абсолютные пути к элементу.
Пример:
set theXMLFile to ((choose file) as string) tell application "System Events" set xmlData to XML file theXMLFile set found_elements to my getXMLElementsByName("p", contents of xmlData) log ("Found " & (count of found_elements) & " <p> nodes") repeat with i from 1 to count of found_elements log (tab & quote & (the value of (item i of found_elements) as text) & quote) end repeat set found_elements to my getXMLElementsByName("popup", contents of xmlData) log ("Found " & (count of found_elements) & " <popup> nodes") end tell on getXMLElementsByName(search_name, search_xml_element) set found to {} using terms from application "System Events" tell search_xml_element set c to the count of XML elements repeat with i from 1 to c if (the name of XML element i is search_name) then set found to found & {XML element i} end if if (the (count of XML elements of XML element i) > 0) then set children_found to my getXMLElementsByName(search_name, XML element i) if (the (count of children_found) > 0) then set found to found & children_found end if end if end repeat end tell end using terms from return found end getXMLElementsByName
Comments