2012-01-25 100 views
1

更新搜索XML元素

我想有一個表達式(XPath的,或正則表達式表達類似的),可以與特定的命名空間相匹配的XML元素。例如,我想查找鏈接元素的值(例如,我需要下面顯示的http://url within <b:link>http://url</b:link>)。但是,名稱空間前綴根據不同的xml文件而有所不同,如情況1-3所示:

考慮到允許的字符命名空間前綴(例如任何允許/有效的字符),任何人都可以提供解決方案(XPath,正則表達式或類似的方法嗎?)

請注意,因爲xml文件是未知的,所以命名空間和前綴在運行時纔是未知的。這是否意味着我不能使用此XDocument/XmlDocument,因爲它需要在代碼中知道命名空間。

更新

案例1

<A xmlns:b="link"> 
<b:link>http://url 
</b:link> 
</A> 

案例2

<A xmlns="link"> 
<link>http://url 
</link> 
</A> 

案例3

<A xmlns:a123="link"> 
<a123:link>http://url 
</a123:link> 
</A> 

請注意,鏈接元素中的URL可以是任何HTTP URL,以及未知的,直到運行。

更新

請註明了我的問題。

回答

5

您需要知道您將要處理的名稱空間並使用XmlNamespaceManager註冊它們。這裏有一個例子:

XmlDocument doc = new XmlDocument(); 
    doc.LoadXml("<A xmlns:b='link'><b:Books /></A>"); 
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); 
    nsmgr.AddNamespace("b", "link"); 

    XmlNodeList books = doc.SelectNodes("//b:Books", nsmgr); 

如果你想做到這一點使用的XDocument,我會建議其簡潔,這裏是如何:

XDocument xDoc = XDocument.Parse("<A xmlns:b='link'><b:Books /></A>"); 
    XNamespace ns = "link"; 
    var books = xDoc.Descendants(ns + "Books"); 

如果你不知道的命名空間(S )提前see this post,它顯示瞭如何僅使用本地名稱跨XDocument進行查詢。這裏有一個例子:

XDocument xDoc = XDocument.Parse("<A xmlns:b='link'><b:Books /></A>"); 
var books = xDoc.Descendants().Where(e => e.Name.LocalName.ToLower() == "books"); 
+0

因爲xml文件是未知的,所以命名空間和前綴在運行時纔是未知的。這是否意味着我不能用這種方式。? – Pingpong

+0

請參閱我更新的答案,它應該在您不知道名稱空間時起作用。 XDocument是處理Xml的一個很好的API。 – GemCer

1

使用XML解析器,而不是正則表達式。

話雖這麼說,你可以使用:

<(?:(.+?):)?Books /> 

而命名空間將是捕獲組1

其實,我更強烈建議您使用

<(?:([^<>]+?):)?Books /> 

爲防止錯誤匹配另一組XML標籤(誰將在名稱空間中使用<> ?!)

+0

它可以處理XDocument和XMLDocument嗎? – Pingpong

+0

如果你有XDocument/XMLDocument,那麼regex是完全不必要的,這就是解析器的要點。我不是C#大師,所以其他人將不得不幫助你使用該類。 –

+0

我將元素更改爲 http:// url ,而不是,需要進行哪些更改?請參閱我更新的案例。謝謝 – Pingpong