C#从XML字符串文档-子节点获取特定值
我有一个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>
<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
语句中,建议不要复制粘贴代码:)