C#从XML字符串文档-子节点获取特定值

C#从XML字符串文档-子节点获取特定值,c#,xml,c#-4.0,C#,Xml,C# 4.0,我有一个XML字符串文档,基本上如下所示: <ItemSpecifics> <NameValueList> <Name>Brand</Name> <Value>KabelDirekt</Value> </NameValueList> <NameValueList> <Name>MPN</Name>

我有一个XML字符串文档,基本上如下所示:

<ItemSpecifics>
      <NameValueList>
        <Name>Brand</Name>
        <Value>KabelDirekt</Value>
      </NameValueList>
      <NameValueList>
        <Name>MPN</Name>
        <Value>514</Value>
      </NameValueList>
      <NameValueList>
        <Name>UPC</Name>
        <Value>797698091655</Value>
      </NameValueList>
    </ItemSpecifics>
 var doc = new XMLDocument();
 doc.LoadXML(myXML);

var _upcValue = doc.GetElementByTagName("ItemSpecifics"); 
// What to do now ?
   <ItemSpecifics>
          <NameValueList>
            <Name>MPN</Name>
            <Value>514</Value>
          </NameValueList>
    </ItemSpecifics>
但我不确定如何从
名称标记中检索UPC值

问题仍然存在,因为UPC值有时可能不存在,但可能是这样的:

<ItemSpecifics>
      <NameValueList>
        <Name>Brand</Name>
        <Value>KabelDirekt</Value>
      </NameValueList>
      <NameValueList>
        <Name>MPN</Name>
        <Value>514</Value>
      </NameValueList>
      <NameValueList>
        <Name>UPC</Name>
        <Value>797698091655</Value>
      </NameValueList>
    </ItemSpecifics>
 var doc = new XMLDocument();
 doc.LoadXML(myXML);

var _upcValue = doc.GetElementByTagName("ItemSpecifics"); 
// What to do now ?
   <ItemSpecifics>
          <NameValueList>
            <Name>MPN</Name>
            <Value>514</Value>
          </NameValueList>
    </ItemSpecifics>

MPN
514
如果标记名是以我要查找的值命名的,我知道该怎么做,但是我现在不知道如何以这样的形式从XML文档中检索它,如果字符串本身中不存在UPC

对于UPC不存在的情况,我只想将其设置为“N/A”


有人能帮我解决这个问题吗?

使用LINQ到XML很容易。例如,您可以将所有值解析到字典中:

var xdoc = XDocument.Parse(myXML);
var itemSpecifics = 
    xdoc.Element("ItemSpecifics")
        .Descendants("NameValueList")
        .ToDictionary(x => (string)x.Element("Name"), x => (string)x.Element("Value"));
对于给定的xml,输出将是:

{
  "Brand": "KabelDirekt",
  "MPN": "514",
  "UPC": "797698091655"
}

使用LINQ到Xml的代码可以更简单

var document = XDocument.Parse(xmlString);
var upcValues = document.Descendants("NameValueList")
                       .Where(pair => pair.Element("Name").Value == "UPC")
                       .Select(pair => pair.Element("Value").Value)
                       .DefaultIfEmpty("n/a");

// upcValues will contain one item "n/a" if no UPC items found
foreach(var upcValue in upcValues) 
{
    // use value
}

尝试下面的代码,它使用XMLLINQ将结果放入字典。代码应该与空UPC一起工作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication49
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, string> nameValue = doc.Descendants("NameValueList")
                .GroupBy(y => (string)y.Element("Name"), z => (string)z.Element("Value"))
                .ToDictionary(y => y.Key, z => z.FirstOrDefault());
        }

    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
使用System.Xml;
使用System.Xml.Linq;
命名空间控制台应用程序49
{
班级计划
{
常量字符串文件名=@“c:\temp\test.xml”;
静态void Main(字符串[]参数)
{
XDocument doc=XDocument.Load(文件名);
字典名称值=文档子体(“名称值列表”)
.GroupBy(y=>(string)y.Element(“名称”),z=>(string)z.Element(“值”))
.ToDictionary(y=>y.Key,z=>z.FirstOrDefault());
}
}
}

当我阅读像这样格式化的XML文件时,我会将所有元素插入一个带有
name=doc.GetElementsByTagName(“name”)
的XmlNodeList,并在列表中循环。
要获取名称的值,请执行以下操作:
Name[0]。InnerText

如果不存在UPC,如何将其设置为
N/A
?字典是一个数据存储。如果键不在字典中,请使用您想要的任何值,例如
itemSpecifics.TryGetValue(“UPC”,out value)?值:“N/A”
如果不存在UPC,如何将其设置为
N/A
?它将为空。你想要什么?不需要?那么z=>(z==null)?“N/A”:(string)z.Element(“Value”)Fabio这看起来真的很好,如果我有多个“ItemSpecific”节点,情况会怎样。。我只想去掉所有节点中的所有UPC?@User987:你一次问的问题太多了。这意味着您需要的是教程而不是问题的答案。@User987,只需删除
.First()
,您将获得所有值的集合,或者如果没有upc值,您将获得一个包含一个item=“n/a”的集合found@ThomasWeller我忘了在问题中包含多个节点,关于…:)change
.Value=“UPC”
。Value==“UPC”
的Where
语句中,建议不要复制粘贴代码:)