2

私はこの優れたフォーラムを使用して、.XML ファイルを照会するための基本的な xpath を独学しました。ここに XML ファイルのサンプルがあります。Matlab を使用して、XML ファイル内の 3 つのオブジェクトの [X,Y] 座標をインポートしようとしています。

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>ROI array</key>
    <array>
        <dict>
            <key>Comments</key>
            <string></string>
            <key>Name</key>
            <string>Unnamed</string>
            <key>ROIPoints</key>
            <array>
                <string>{129.24051549947484, 263.66036033996352}</string>
                <string>{114.61421850240453, 278.56760216125258}</string>
                <string>{123.11826208150609, 289.73859978088149}</string>
                            <string>{125.11111111111111, 295.77777777777777}</string>
            </array>
            <key>Slice</key>
            <integer>58</integer>
        </dict>
        <dict>
            <key>Comments</key>
            <string></string>
            <key>Name</key>
            <string>Unnamed</string>
            <key>ROIPoints</key>
            <array>
                <string>{127.09352448499425, 261.31629753478774}</string>
                <string>{112.50917389905675, 277.25509453185805}</string>
                <string>{126.061969309213, 291.36980247863539}</string>
                <string>{141.48499634778722, 292.16234398254164}</string>
                <string>{149.71229126966222, 277.81281090148696}</string>
            </array>
            <key>Slice</key>
            <integer>59</integer>
        </dict>
        <dict>
            <key>Comments</key>
            <string></string>
            <key>Name</key>
            <string>Unnamed</string>
            <key>ROIPoints</key>
            <array>
                <string>{134.32833430087788, 258.21743274101027}</string>
                <string>{117.0812182120107, 266.44891620048293}</string>
                <string>{114.41427180087788, 292.20427203544386}</string>
                <string>{128.80573603427632, 299.11905932792433}</string>
                <string>{147.92307612216695, 299.11905932792433}</string>
                <string>{152.73700281894429, 285.80526996024855}</string>
                <string>{154.32626673495992, 268.51202655204543}</string>
            </array>
            <key>Slice</key>
            <integer>60</integer>
        </dict>
        </array>
</dict>
</plist>

この Matlab コードを使用して、すべての座標をエクスポートすることができました。

expression_2 = xpath.compile('plist/dict/array/dict/array/string');
nodeList_2 = expression_2.evaluate(docNode, XPathConstants.NODESET);
for i = 1:nodeList_2.getLength
    node = nodeList_2.item(i-1);
    coordinate_node{i} = char(node.getFirstChild.getNodeValue);
end

各オブジェクトの[X、Y]座標の数を数えることができるxpathクエリを知っている人はいますか? つまり、最初のオブジェクトに 4 つの座標、2 番目に 5 つの座標、3 番目に 7 つの座標を返すものですか?

ありがとう、ジム

4

2 に答える 2

1

私はあなたの matlab の XPath 実装に精通していませんが、XPath には集計関数があり、それらを Java で使用しました。

http://www.w3.org/TR/xpath-functions/#func-count

最初に、このトピックに関する matlab のマニュアルを参照してください。この同様の質問で使用方法を一目で確認することもできます。

XPath を使用して特定の属性を持つノードの数をカウントする方法

于 2013-01-23T10:37:38.020 に答える
1

あなたは正しい軌道に乗っています。ただし、問題は、親の「配列」ノードを無視して、コードがすべての「文字列」ノードをフラットな方法で抽出することです。この方法では、どの座標がどのオブジェクトに属しているかわかりません。

コードを少し変更して、「配列」ノードと「文字列」ノードを階層的に通過するようにすると、次のように動作します。

%// Extract 'array' nodes
expr_array = xpath.compile('plist/dict/array/dict/array');
nodeList_array = expr_array.evaluate(docNode, XPathConstants.NODESET);
C = cell(nodeList_array.getLength, 1);
for k = 1:nodeList_array.getLength

    %// Extract 'string' nodes
    node_array = nodeList_array.item(k - 1);
    expr_string = xpath.compile('string');
    nodeList_string = expr_string.evaluate(node_array, XPathConstants.NODESET);
    coordinates = zeros(nodeList_string.getLength, 2);
    for m = 1:nodeList_string.getLength
        node_string = nodeList_string.item(m - 1);
        s = char(node_string.getFirstChild.getNodeValue); %// Extract string
        coordinates(m, :) = str2num(s(2:end - 1));        %// Convert to numbers
    end
    C{k} = coordinates;
end

これで、セル配列Cにすべての座標が含まれるようになりました (ちなみに、行列に格納して簡単に操作できるように、それらを数値に変換しました)。

C{1} =
  129.2405  263.6604
  114.6142  278.5676
  123.1183  289.7386
  125.1111  295.7778

C{2} =
  127.0935  261.3163
  112.5092  277.2551
  126.0620  291.3698
  141.4850  292.1623
  149.7123  277.8128

C{3} =
  134.3283  258.2174
  117.0812  266.4489
  114.4143  292.2043
  128.8057  299.1191
  147.9231  299.1191
  152.7370  285.8053
  154.3263  268.5120

各セル (オブジェクト) の座標数が必要な場合は、次のようにします。

cellfun(@(c)size(c, 1), C)

and you'll get the desired result:

ans=
    4
    5
    7
于 2013-01-23T11:29:15.853 に答える