我在MATLAB實現的一個非常愚蠢的XPath過濾器:xmlns聲明打破了我的XPath過濾器
% Construct the DOM.
docNode = xmlread('C:\Users\MATLAB\test.gpx');
% get the xpath mechanism into the workspace
import javax.xml.xpath.*
factory = XPathFactory.newInstance;
xpath = factory.newXPath;
% compile and evaluate the XPath Expression
expression = xpath.compile('gpx/AddressBook/Entry/PhoneNumber');
phoneNumberNode = expression.evaluate(docNode, XPathConstants.NODE);
phoneNumber = phoneNumberNode.getTextContent
有了這個XML(特別是有.GPX文件),它的工作原理:
<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?>
<gpx version='1.1' creator='TTTracklog V.1.13'>
<AddressBook>
<Entry>
<Name>Friendly J. Mathworker</Name>
<PhoneNumber>(508) 647-7000</PhoneNumber>
<Address hasZip="no" type="work">3 Apple Hill Dr, Natick MA</Address>
</Entry>
</AddressBook>
</gpx>
和文字( 508)647-7000被返回。 簡單地增加xmlns屬性來GPX節點以這樣的方式
<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?>
<gpx version='1.1' creator='TTTracklog V.1.13' xmlns='http://www.topografix.com/GPX/1/1'>
<AddressBook>
<Entry>
<Name>Friendly J. Mathworker</Name>
<PhoneNumber>(508) 647-7000</PhoneNumber>
<Address hasZip="no" type="work">3 Apple Hill Dr, Natick MA</Address>
</Entry>
</AddressBook>
</gpx>
給了我的錯誤,和MATLAB報告:
???嘗試去引用非結構數組字段。
在12 phoneNumber的= phoneNumberNode.getTextContent
爲什麼在==>測試錯誤?我怎樣才能避免這個錯誤?
我不知道MATLAB,但從XML的角度來看,您現在已將gpx(etc.)元素放置在http://www.topografix.com/GPX/1/1名稱空間中,XPath正在全局名稱空間中查找它。您需要以某種方式使MatLab知道名稱空間,然後限定XPath表達式中的gpx元素。 – Dabbler
好問題,+1。如果你沒有Matlab中的機制來註冊一個命名空間,你可以使用這樣的表達式:'* [name()='gpx'] /* [name()='AddressBook'] /* [name()='Entry'] /* [name()='PhoneNumber']' –
@_Mariano:我的回答有用嗎? –