2

我尝试创建 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>

苹果脚本

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

当我运行脚本时,我收到此错误:System Events got an error: Can't get XML element "p" of XML element "xfdf" of XML file 的内容。有什么地方可以从 XML 中提取这些值。提取"popup""p"的值。
编辑

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
4

2 回答 2

5

您直接向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"}}

另一种选择是使用来自 Late Night Software的XML Tools Scripting Addition 。

于 2014-01-22T16:04:04.717 回答
3

我写了一个可以解决这个问题的递归辅助函数。

它搜索 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
于 2014-01-22T12:25:41.003 回答