2012-11-21 108 views
3

我是xpath匹配的新手。在這裏我有一個傳遞XML的方法,包含字符串。我將它轉換成XmlDocument。當有命名空間時從xpath獲取XML的值

public static void getProjectDataInfo(string content) { 

      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(content); 
} 

這是我的XML。它的xmlns:我

<?xml version="1.0" encoding="UTF-8"?> 
<my:myFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xml:lang="en-us"> 
    <my:Financial> 
     <my:Quote> 
    <my:CHARGE_TYPE>MRC</my:CHARGE_TYPE> 
    <my:Price>463.92</my:Price> 
     </my:Quote> 
    </my:Financial> 
</my:myField> 

我只是想獲得的

/my:myFields/my:Financial/my:Quote/my:Price 

值不過,我無法得到的值,因此該XML具有的xmlns。

請幫幫我。

回答

4

使用XmlNamespaceManager

XmlNamespaceManager nsmgr = new XmlNamespaceManager(new NameTable()); 
nsmgr.AddNamespace("ns", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46"); 

var str = doc.XPathSelectElement("/root/ns:myFields/ns:Financial/ns:Quote/ns:Price", nsmgr) 
      .ToString(SaveOptions.DisableFormatting); 
Console.WriteLine(str); 
+0

我認爲我們無法同時獲得'/ root/ns:myFields/ns:Financial/ns:Quote/ns:Price'。對此我感到不解。 – devan

+0

是的。我們需要逐個獲取它。我不敢執行它。這是一個邏輯錯誤。謝謝。 – Typist

0

使用LINQ2XML

XElement doc=XElement.Parse(content); 
XNamespace my="http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46"; 
var price=doc.Element(my+"myFields").Element(my+"Financial").Element(my+"Quote").Element(my+"Price").Value; 

[如果你想與OLD東西粘]

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.OwnerDocument.NameTable); 
nsmgr.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46"); 
var priceNode = el.SelectNode(@"/my:myFields/my:Financial/my:Quote/my:Price", nsmgr); 
0

你需要告訴什麼my前綴綁定到的XmlDocument 。你使用XmlNamespaceManager來做到這一點。這裏是一個例子http://support.microsoft.com/kb/316913。在你的情況,你會怎麼做:

xmlns.AddNamespace("my", "http://schemas.microsoft.com/office/infopath/2003/myXSD/2012-02-03T16:54:46")

0

有關InfoPath表單2013,它可能是如下:

的XmlNamespaceManager nsmgr =新的XmlNamespaceManager(新NameTable() ); nsmgr.AddNamespace(「my」,「http://schemas.microsoft.com/office/infopath/2003/myXSD/2014-11-10T18:44:26」);

XmlNode root = doc.DocumentElement;您的IDNode = root.SelectSingleNode(「/ my:myFields/my:YourID」,nsmgr);

詳細的「我的」名稱空間定義,您可以從共享點文檔庫下載您的信息表單提交XML數據保留。下載其中一個已保存的infopath表單xml數據文件,並用記事本打開它,然後您將在內容頂部找到它。