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

时间:2017-04-10 13:15:15

标签: c# xml c#-4.0

我有一个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 ?

但我不确定如何从Name tag

中检索UPC值

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

   <ItemSpecifics>
          <NameValueList>
            <Name>MPN</Name>
            <Value>514</Value>
          </NameValueList>
    </ItemSpecifics>

我知道如果标签名称以我之后的值命名后该怎么办,而是我现在不知道如何从这样的形式从XML文档中检索它,如果字符串本身不存在UPC ..

对于没有UPC的情况,我只想将其设置为&#34; N / A&#34;。

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

4 个答案:

答案 0 :(得分:2)

使用LINQ to 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
}

答案 1 :(得分:1)

使用LINQ to 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"
}

答案 2 :(得分:1)

尝试下面的代码,使用XML Linq将结果放入字典中。代码应该使用null 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());
        }

    }
}

答案 3 :(得分:1)

当我读取这样形成的XML文件时,我将所有元素插入到带有name = doc.GetElementsByTagName("Name")的XmlNodeList中,并通过列表循环。 要获取Name的值,请执行name[0].InnerText