2015-11-19 5 views
1

Ниже часть моего файла XMLXML требуется в MATLAB

<?xml version="1.0" encoding="utf-8"?> 
<osm generator="osmfilter 1.3A" version="0.6"> 
<node id="21295457" lat="53.4848139" lon="9.1540558" /> 
<node id="21316767" lat="53.0771599" lon="8.8030142" > 
    <tag k="bicycle" v="yes"/> 
    <tag k="highway" v="crossing"/> 
    <tag k="crossing" v="traffic_signals"/> 
</node> 
<node id="254069931" lat="48.9309975" lon="8.63482" > 
    <tag k="name" v="KV Ersingen Kirchbergsiedlung"/> 
    <tag k="power" v="substation"/> 
</node> 
<node id="254070051" lat="48.9277761" lon="8.6328671" > 
    <tag k="name" v="Umspannstation Ersingen Laierbergstraße"/> 
    <tag k="power" v="sub_station"/> 
    <tag k="operator" v="EnBW"/> 
</node> 
<node id="21929724" lat="54.8040971" lon="9.4346464" /> 
<node id="3444576256" lat="49.3993194" lon="11.0195838" > 
    <tag k="power" v="station"/> 
</node> 
<node id="3444576257" lat="49.4002323" lon="11.0183178" > 
    <tag k="power" v="station"/> 
</node> 

Я хотел бы получить атрибут id каждого узла, выполнив петлю, а затем проверить, если этот узел имеет ChildNodes tag

Это я достиг, используя следующий код

xDoc = xmlread(path); 
osmNode = xDoc.getDocumentElement; 
nodes = osmNode.getElementsByTagName('node'); 
node_Matrix = zeros(nodes.getLength,3); 
for i = 0 : nodes.getLength-1 
    node_IDs = nodes.item(i).getAttribute('id'); 
    node_Matrix(i+1,1) = str2double(node_IDs); 

    if nodes.item(i).hasChildNodes 
     import javax.xml.xpath.* 
     factory = XPathFactory.newInstance(); 
     xpath = factory.newXPath(); 
     expression = xpath.compile('//osm/node[i][tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]]'); 
     List = expression.evaluate(xDoc, XPathConstants.NODESET); 
     List.getLength; 
    end 
end 

Теперь я хотел бы проверить, есть ли у дочерних узлов tag каждого узла атрибут v="substation или v="sub_station или v="station без перехвата всех дочерних узлов. Для этого я использовал концепцию xpath. Но, мне нужно выражение XPath, который не дает мне все матчи, но только матч (если он присутствует) внутри данного цикла итерации i

я включил часть node[i] в моем выражении XPATH //osm/node[i][tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]] Но это дает мне все матчей. Что мне здесь не хватает? Может кто-нибудь, пожалуйста, дайте мне правильное выражение?

Заранее благодарен!

ответ

0

Вы можете попробовать использовать XPath, что по отношению к текущей nodes.item(i) вместо этого, например:

..... 
expression = xpath.compile('self::*[tag[@v="station"] or tag[@v= "substation"] or tag[@v="sub_station"]]'); 
List = expression.evaluate(nodes.item(i), XPathConstants.NODESET); 
List.getLength; 
+0

Это именно то, что я искал! Большое спасибо. Не могли бы вы дать мне несколько ссылок (кроме w3schools.com!), Где я могу читать ключевые слова, такие как «self» и т. Д. Я довольно новичок в xml, xpath и хотел бы узнать больше! –

+0

Разумеется, я бы рекомендовал официальную [спецификацию XPath 1.0] (http://www.w3.org/TR/xpath/) для справки – har07