help using Xpath and XML reading

14 次查看(过去 30 天)
Dear all,
I'm recently new to using Matlab to navigate through an XML file, and have a feeling theres a simple answer to my query starting me in the face. I have an XML file which contains coordinates of 3 objects that come from a different program. I'm trying to import the coordinates of these objects and associated image number (identified by integer) into Matlab. I'm able to find the coordinates of each object individually, but would anyone know of a loop I could use as other XML files are a few hundred entries long
Heres my Matlab code so far:
import javax.xml.xpath.*
factory = XPathFactory.newInstance;
xpath = factory.newXPath;
expression = xpath.compile('plist/dict/array/dict/array');
coordinate_node = expression.evaluate(docNode, XPathConstants.STRING)
I tried the following, which does find 3 instances of "<array>" but simply outputs the same set of coordinates 3 times.
expression = xpath.compile('plist/dict/array/dict/array');
nodeList = expression.evaluate(docNode, XPathConstants.NODESET)
for i = 1:nodeList.getLength
node = nodeList.item(i-1);
coordinate_node{i} = expression.evaluate(docNode, XPathConstants.STRING)
end
And below is the XML file:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<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>
</array>
<key>Slice</key>
<integer>58</integer>
<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>
<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>
</array>
</dict>
</plist>
Any help greatly appreciated!
Jim

采纳的回答

Jarrod Rivituso
Jarrod Rivituso 2013-2-2
I may be misunderstanding things, but I think you may want to try doing something like this:
dictExpr = xpath.compile('//dict');
allDict = dictExpr.evaluate(docNode, XPathConstants.NODESET)
Then, loop over the each "dict" element and get all the strings within an "array" element
stringExpr = xpath.compile('array//string')
for i = 1:allDict.getLength
currentDict = allDict.item(i-1);
stringNodesInCoord = stringExpr.evaluate(currentDict, XPathConstants.NODESET)
end
Also, I'd be interested in hearing what you think of this tool I made (I've dabbled with making xpath easier in MATLAB)
Oh, and I think there is an error in your initial code that you copied. I think
coordinate_node{i} = expression.evaluate(docNode, XPathConstants.STRING)
should be
coordinate_node{i} = expression.evaluate(node , XPathConstants.STRING)
Hope this helps!
-Jarrod

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Structured Data and XML Documents 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by