2013-04-03 216 views
1

想,我有follwing XML:XML閱讀字符串值

<SplitterLayoutDataSet xmlns="http://tempuri.org/SplitterLayoutDataSet.xsd"> 
     <SplitterLayout> 
      <SplitterName>mainSplitContainerControl</SplitterName> 
      <SplitterPosition>0.2213375796178344</SplitterPosition> 
     </SplitterLayout> 
    </SplitterLayoutDataSet> 

我需要一種方法如何讓SplitterPosition值,在這種情況下:0.2213375796178344。是否有任何收據在不使用Linq-to-XML的情況下達成此解決方案,或者將這些方法結合使用?這個XML是在SplitterLayoutDataset.xsd文件中設計的。或者,如何直接使用C#工具讀取該文件的字段SplitterPosition? 感謝

+8

你爲什麼不喜歡的LINQ to XML? –

+0

同意@OleksandrPshenychnyy - 這在LINQ to XML中絕對是微不足道的。 – Tim

+0

如果你不喜歡LINQ到XML,那麼就有'XmlDocument',或者你甚至可以直接使用'XmlReader' ......但是如果你想手工字符串操作的答案,你必須證明你理解了整個XML規範,然後才能給出答案:) –

回答

2

下面是使用XmlDocumentSelectSingleNode一個解決方案:

var xml = @" 
<SplitterLayoutDataSet xmlns=""http://tempuri.org/SplitterLayoutDataSet.xsd""> 
    <SplitterLayout> 
     <SplitterName>mainSplitContainerControl</SplitterName> 
     <SplitterPosition>0.2213375796178344</SplitterPosition> 
    </SplitterLayout> 
</SplitterLayoutDataSet>"; 

//Create XmlDocument 
var xmlDoc = new XmlDocument(); 
xmlDoc.LoadXml(xml); 

//Create NamespaceManager (for XPath) 
var nsMgr = new XmlNamespaceManager(xmlDoc.NameTable); 
nsMgr.AddNamespace("dn", "http://tempuri.org/SplitterLayoutDataSet.xsd"); 

//Get inner text of SplitterLayout/SplitterPosition 
var xPath = "//dn:SplitterLayout/dn:SplitterPosition"; 
Console.WriteLine(xmlDoc.SelectSingleNode(xPath, nsMgr).InnerText); 

或基於@ AlexeiLevenkov的建議,您可以通過使用以下XPath消除NamespaceManager

var xPath = "//*[local-name()='SplitterPosition']"; 
Console.WriteLine(xmlDoc.SelectSingleNode(xPath).InnerText); 

當然,你也可以用XDocument

var xdoc = XDocument.Parse(xml); 
XNamespace ns = @"http://tempuri.org/SplitterLayoutDataSet.xsd"; 
Console.WriteLine(xdoc.Descendants(ns + "SplitterPosition").First().Value); 

或者使用XDocumentXPathSelectElement

var xdoc = XDocument.Parse(xml); 
var xPath = "//*[local-name()='SplitterPosition']"; 
Console.WriteLine(xdoc.XPathSelectElement(xPath).Value); 
+0

非常感謝!我會試試:) – Kirill

+0

+1 ...也有兩個版本不搜索相同的元素...和XPath可能很簡單'「// * [local-name()='SplitterPosition']」' (或者添加namespace-uri檢查)以匹配「xdoc.Descendants」調用並避免所有名稱空間設置。 –

+0

@AlexeiLevenkov有沒有辦法在不指定'XNamespace'的情況下使用'XDocument'來獲得'SplitterPosition'? – rsbarro