【问题标题】:C# Xml Parse SelectNodesC# Xml 解析选择节点
【发布时间】:2014-09-04 07:47:56
【问题描述】:

我有下一个 xml 代码:

<Start>
       <MetricValue>
                    <Name>Name1</Name>
                    <Value>1</Value>
       </MetricValue>
       <MetricValue>
                    <Name>Name1</Name>
                    <Value>1</Value>
       </MetricValue>
       <Test>
             <MetricValue>
                          <Name>Name1</Name>
                          <Value>1</Value>
             </MetricValue>
             <MetricValue>
                          <Name>Name1</Name>
                          <Value>1</Value>
             </MetricValue>
       </Test>
</Start>

我正在尝试仅解析前 2 个指标值,而不是来自“测试”标签之间的指标值。

XmlNodeList nlMetricValues = xmlDoc.SelectNodes("//Start//MetricValue");
foreach (XmlNode nMetricValue in nlMetricValues)
{
        Console.WriteLine("\Name: " + nMetricValue.SelectSingleNode(".//Name").InnerText);
        Console.WriteLine("\tValue: " + nMetricValue.SelectSingleNode(".//Value")).InnerText);
}

但这个 foreach 正在解析所有指标值。我应该怎么做才能解决这个问题?

【问题讨论】:

  • 请添加用于选择 MetricValue 节点的 XPath,因为这可能是问题所在。
  • 完成。我也添加了 xmlnode

标签: c# xml parsing foreach selectnodes


【解决方案1】:

您的XPath 应该是"./Start/MetricValue",因为"//" 意味着它将在节点树中搜索前一个节点下方的任何匹配项。

语法备忘单链接:W3Schools - XPath Syntax

【讨论】:

    【解决方案2】:

    你可以使用XElement类的方法Elements()。它将仅加载作为 Start 元素的子元素的 MetricValue 元素:

    var xml = @"
    <Start>
        <MetricValue>
            <Name>Name1</Name>
            <Value>1</Value>
        </MetricValue>
        <MetricValue>
            <Name>Name1</Name>
            <Value>1</Value>
        </MetricValue>
        <Test>
            <MetricValue>
                <Name>Name1</Name>
                <Value>1</Value>
            </MetricValue>
            <MetricValue>
                <Name>Name1</Name>
                <Value>1</Value>
            </MetricValue>
        </Test>
    </Start>";
    
    var metricValues = XElement.Parse(xml).Elements("MetricValue");
    

    【讨论】:

    • 不应该是XElement.Parse(xml).Element("Start").Elements("MetricValue");吗?
    • @toadflakz,不,不是。这里的根元素是Start,因此您不需要再次调用Element() 方法。
    • 是的 - 我通常一直使用 XDocument.Parse() 并且需要额外的 Element() 调用,这就是我查询它的原因 - 显然 XElement.Parse() 返回 XElement,而不是 XDocument !糟糕!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多