【问题标题】:XmlDocument query taking two valuesXmlDocument 查询采用两个值
【发布时间】:2011-11-09 12:01:06
【问题描述】:

我如何进行以下查询

如果我有 XmlDocument 并且它可能有以下 xml

<EquipmentParameterModified dateTime="2011-04-06T12:03:10.00+01:00" parameter="ExtApp">
  <Extensions ParameterId="External App Interface" FromParameterValue="" ToParameterValue="DISABLED"/>
</EquipmentParameterModified>

如何检查我是否拥有EquipmentParameterModified 并获取ParameterIdToParameterValue 的值

感谢您的帮助。

【问题讨论】:

  • “检查是否有”是什么意思? .. Xml 是否有时包含这些节点,有时不包含?

标签: c# .net .net-2.0 xmldocument


【解决方案1】:
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(new StringReader(xmlstr));
XmlNode node = xmldoc.GetElementsByTagName("Extensions").Item(0);
string id =  node.Attributes["ParameterId"].Value;
string val = node.Attributes["ToParameterValue"].Value;

【讨论】:

  • plus:你应该检查你是否真的找到了任何“扩展”标签(XmlNodeList.Count 属性),或者使用 try-catch 块。
  • @Efrain 只是为了简单。它提供了一个关于如何做的想法。
  • @L.B,我正在使用 xmldoc.GetElementsByTagName("Extensions")[0];数组访问器前缀必须是数组类型
  • @NightWalker 查看编辑后的版本。我将[0] 更改为Item(0)
  • @L.B 我现在在 Attributes 行“访问器必须是序数但是 'String'”上又遇到一个错误
【解决方案2】:

您是否要在给定 2 个输入搜索值的情况下查找元素?你希望你的输出是什么?如果你只是想看看你有一个匹配的元素,这段代码应该可以解决问题:

如果是,请尝试以下操作:

        public static void Main()
        {
            var paramId = "External App Interface";
            var toParameterValue = "DISABLED";

            var xdoc = XDocument.Parse(@"
<EquipmentParameterModified dateTime='2011-04-06T12:03:10.00+01:00' parameter='ExtApp'>
  <Extensions ParameterId='External App Interface' FromParameterValue='' ToParameterValue='DISABLED'/>
</EquipmentParameterModified>");

            var ret = xdoc.Root
                .Elements("Extensions")
                .Where(e => e.Attribute("ParameterId").Value == paramId &&
                            e.Attribute("ToParameterValue").Value == toParameterValue)
                .FirstOrDefault();

            if (ret != null)
                Console.WriteLine(ret.Name);

        }

.NET 2.0 和 XmlDocument 更新:

        public static void Main()
        {
            var paramId = "External App Interface";
            var toParameterValue = "DISABLED";

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(@"
<EquipmentParameterModified dateTime='2011-04-06T12:03:10.00+01:00' parameter='ExtApp'>
  <Extensions ParameterId='External App Interface' FromParameterValue='' ToParameterValue='DISABLED'/>
</EquipmentParameterModified>");

            XmlNode node = xmlDoc.GetElementsByTagName("Extensions")[0];
            if (node.Attributes["ParameterId"].Value == paramId &&
                node.Attributes["ToParameterValue"].Value == toParameterValue)
            {
                Console.WriteLine("Found matching node:" + node.Name);
                return;
            }
        }

【讨论】:

  • XDocument 不只是 .NET 3.5 及更高版本吗?无论如何,我更新了问题标签
  • @JohnD,对不起我的错误,我在考虑 XmlDocument 并写了 XDocument
  • 数组访问器前缀必须是数组类型。我在 xmlDoc.GetElementsByTagName 上得到了它
  • 这很奇怪,它是一个 XmlNodeList 应该有一个 indexer 属性。你能看到 xmlDoc.GetElementsByTagName("Extensions") 的返回值是什么吗?
  • 我不知道为什么它不工作,但你能试试 .Item(0) 而不是 [0] 吗? (代码更新)
【解决方案3】:

我建议使用 XPath 来获取您的目标元素,进行空值检查,然后获取该元素的特定属性,在调用 .Value 属性之前对属性值进行空值检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多