【问题标题】:XML reading string value between tags标记之间的 XML 读取字符串值
【发布时间】:2013-04-03 15:48:05
【问题描述】:

假设,我有以下 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 字段? 谢谢

【问题讨论】:

  • 你为什么不喜欢 LINQ to XML?
  • 同意@OleksandrPshenychnyy - 这在 LINQ to XML 中绝对是微不足道的。
  • 如果你不喜欢 LINQ-to-XML 有 XmlDocument 或者你甚至可以直接使用 XmlReader... 但是如果你想要手动字符串操作答案你必须证明你理解整个 XML在给出这样的答案之前的规范:)
  • 我喜欢 LINQ to XML,但它会使程序逻辑崩溃。否则,它必须完全重写
  • @Krill - 听起来问题更大。

标签: c# xml


【解决方案1】:

这是使用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);

【讨论】:

  • 非常感谢!我会试试看:)
  • +1... 两个版本也没有搜索相同的元素... XPath 可能只是 "//*[local-name()='SplitterPosition']" (或添加命名空间-uri 检查)以匹配“xdoc.Descendants”调用并避免所有命名空间设置。
  • @AlexeiLevenkov 有没有办法在不指定XNamespace 的情况下使用XDocument 获取SplitterPosition
  • 您可以使用XPathSelectElementXDocument中选择具有XPath的节点。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2021-06-22
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2013-02-28
相关资源
最近更新 更多