我有一个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值有时可能不存在,但可能就是这样:
<ItemSpecifics>
<NameValueList>
<Name>MPN</Name>
<Value>514</Value>
</NameValueList>
</ItemSpecifics>
我知道如果标签名称以我之后的值命名后该怎么办,而是我现在不知道如何从这样的形式从XML文档中检索它,如果字符串本身不存在UPC ..
对于没有UPC的情况,我只想将其设置为&#34; N / A&#34;。
有人可以帮我解决这个问题吗?
答案 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
。