Reputation: 37
Suppose, I have the follwing XML:
<SplitterLayoutDataSet xmlns="http://tempuri.org/SplitterLayoutDataSet.xsd">
<SplitterLayout>
<SplitterName>mainSplitContainerControl</SplitterName>
<SplitterPosition>0.2213375796178344</SplitterPosition>
</SplitterLayout>
</SplitterLayoutDataSet>
I need a way how to get SplitterPosition value, in this case: 0.2213375796178344. Is there any receipt to reach this solution without using Linq-to-XML, or letting combine these ways? This XML is designed in SplitterLayoutDataset.xsd file. Or how do I read the field SplitterPosition of that file directly with C# tools? Thanks
Upvotes: 1
Views: 905
Reputation: 27349
Here's a solution using XmlDocument
and SelectSingleNode
:
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);
Or based on @AlexeiLevenkov's suggestion, you could eliminate the NamespaceManager
by using the following XPath:
var xPath = "//*[local-name()='SplitterPosition']";
Console.WriteLine(xmlDoc.SelectSingleNode(xPath).InnerText);
Of course, you can also use XDocument
:
var xdoc = XDocument.Parse(xml);
XNamespace ns = @"http://tempuri.org/SplitterLayoutDataSet.xsd";
Console.WriteLine(xdoc.Descendants(ns + "SplitterPosition").First().Value);
Or using XDocument
and XPathSelectElement
:
var xdoc = XDocument.Parse(xml);
var xPath = "//*[local-name()='SplitterPosition']";
Console.WriteLine(xdoc.XPathSelectElement(xPath).Value);
Upvotes: 2