2010-01-04 71 views
2

我有引用命名空間是沒有可用的XML文檔:我有一個腳本讀取它很好,但只有當我刪除了上述兩個標籤,否則它讀取這一切搞砸了如何用Perl的LibXML忽略不良的xmlns命名空間?

<microplateDoc xmlns="http://moleculardevices.com/microplateML"> 
...my data is here... 
</microplateDoc> 

。忽略它可以嗎?我正在考慮編寫另一個腳本來檢查我的所有輸入文件並刪除這兩行,但我認爲可能有更好的方法?

如果我確實遍歷了所有的數據文件並刪除了這兩行,那麼使用腳本執行此操作的最佳方法是什麼?我認爲只是打開每個文件,搜索這些條款,刪除它們,保存文件,你能想出更好的方法嗎?謝謝。

+0

也許你可以發佈你的代碼的相關部分。它肯定會有所幫助。正如羅伯特羅斯尼所說的那樣 - 不可能說出你的描述有什麼問題。這是一個完全有效的命名空間聲明,所以其他事情可能會在這裏發生。 – 2010-01-04 09:40:21

+0

感謝所有提供的幫助,下面解決了問題。 – John 2010-01-10 23:13:55

回答

1

我不認爲你的名字空間有什麼問題,除非你確信不會有任何不受歡迎的副作用,否則我不會去混淆輸入文件。我認爲它發生的是一個常見的初學XML處理錯誤:在您訪問該名稱空間中的節點之前,需要在代碼中註冊名稱空間(即綁定到前綴)。

http://perl-xml.sourceforge.net/faq/#namespaces_xpath看起來像一個有用的例子。我通常不使用Perl,但我已經看到這發生在一堆其他語言中。

+0

非常感謝,你是正確的,我未能註冊的名稱空間。我錯誤地認爲命名空間是位於特定地址的變量名稱列表。 我將這兩行從您指出的網站: 我的$ XPC = XML ::的libxml :: XPathContext->新($樹); $ xpc-> registerNs(microplateML => 'http://moleculardevices.com/microplateML');現在我可以訪問像這樣的元素: foreach我的$ camelid($ xpc-> findnodes('// microplateML:species')){ 它仍然不能100%工作,但是這是問題,不是畢竟需要刪除該行。再次感謝。 – John 2010-01-10 23:13:14

1

關於從文件中刪除行,今天早些時候提出了this exact question。 (只需添加-d到SED選項刪除匹配的行。)

+0

感謝您的鏈接以太網,我仍然渴望聽到別人的意見,如果有辦法告訴解析器忽略它。這比刪除它更容易。 – John 2010-01-04 07:46:57

+0

我的XML-FU是目前差,所以你在其他人的擺佈這裏恐怕:) – Ether 2010-01-05 01:53:36

3

我有引用命名空間的XML文檔沒有可用的:

我懷疑你無所適從一個XML命名空間是。命名空間是Uniform Resource Identifier,也就是說符合RFC 3305的字符串。它不是(必然)是統一資源定位器,儘管它可以是,因爲URL都是URI。

重要的是:僅僅因爲XML名稱空間以http://開頭並不意味着XML解析器將查找它。它不會(除非編寫它的人不明白命名空間是什麼,在這種情況下,你會遇到比這更多的問題)。

當你說讀取這個XML文檔的腳本「讀取它全部搞砸了」時,不可能說出你的意思。忽略它可以嗎?它可能很好。畢竟,命名空間的目的之一就是能夠將信息嵌入XML文檔中,該文檔的某些使用者可以忽略它們。另一方面,如果你不是唯一使用這些文件的人,那麼你可能會通過刪除別人需要的數據而給自己造成很大的麻煩。

1

那麼你指出的是,當XMLMLXML文檔中的命名空間沒有正確的前綴時,XML :: LibXML模塊沒有正確解析你的xml文件/內容?解決方法是動態刪除名稱空間。您可以執行以下操作:

$ xml =〜s/xmlns \ =([\ S] +)// m;

這應該刪除一切開始的xmlns =「」

0

您可以搜索節點使用XPath像//*[name()="microplateDoc"]。希望這可以工作。 謝謝。