我有一个我需要处理的给定XML文件。为了论证,让我说我已经把它作为一个字符串加载了。
<?xml version="1.0" encoding="UTF-8" ?>
<GROUP ID="_group_id" ORDERINFO="00000" TITLE="Group 1">
<GROUP ID="_group_id_2" TITLE="Group 2">
<LO ID="_id_code1" LANG="enUS" TYPE="_cust" TITLE="Title 1" />
<LO ID="_id_code2" LANG="enUS" TYPE="_cust" TITLE="Title 2" />
</GROUP>
<GROUP ID="_group_id_3" TITLE="Group 3">
<LO ID="_id_code1" LANG="enUS" TYPE="_cust" TITLE="Title 1" />
<LO ID="_id_code2" LANG="enUS" TYPE="_cust" TITLE="Title 2" />
</GROUP>
</GROUP>
给定的XML文件中可以有许多LO和许多GROUP。我一直在尝试各种方法,没有运气。我需要一些能够通过ID找到匹配的LO到给定字符串的东西,然后允许我将相应的TYPE和TITLE检索到字符串中,以便我可以使用它们进行处理。
我尝试将文件读入XmlDocument,但一旦加载,我就无法弄清楚如何找到合适的元素。
很抱歉在编辑之前发帖 - 有些文字被截断
答案 0 :(得分:4)
您可以使用XmlDocument
或XDocument
来解析Xml。
以下是XDocument
的示例:
数据类:
public class Lo
{
public string Id { get; set; }
public string Lang { get; set; }
public string Type { get; set; }
public string Title { get; set; }
}
代码:
var document = XDocument.Parse(data);
var value = "_id_code1";
IEnumerable<Lo> result =
document.XPathSelectElements(".//LO")
.Where(x => x.Attribute("ID").Value == value)
.Select(x =>
new Lo
{
Id = x.Attribute("ID").Value,
Lang = x.Attribute("LANG").Value,
Type = x.Attribute("TYPE").Value,
Title = x.Attribute("TITLE").Value
});
答案 1 :(得分:2)
当加载到XmlDocument中时,您可以使用XPath来查找注释。
E.g:
XmlNode group = xmlDocument.SelectSingleNode("/GROUP/GROUP[@ID='_group_id_2']");
或者:
XmlNodeList groups = xmlDocument.SelectNodes("/GROUP/GROUP");
foreach(XmlNode group in groups)
{
string id = group.Attributes["ID"].Value;
}
这很容易。如需更全面的浏览,请搜索互联网。
答案 2 :(得分:1)
答案 3 :(得分:0)
最好将XAtribute
强制转换为字符串,然后访问其Value
属性(如果找不到某个属性,则会获得null
而不是异常)。此处查询语法也更紧凑
string id = "_id_code1";
XDocument xdoc = XDocument.Parse(xml);
var query = from lo in xdoc.Descendants("LO")
where (string)lo.Attribute("ID") == id
select new {
Id = (string)lo.Attribute("ID"),
Language = (string)lo.Attribute("LANG"),
Type = (string)lo.Attribute("TYPE"),
Title = (string)lo.Attribute("TITLE")
};
此查询将返回具有属性Id,Language,Type,Title的匿名对象序列。您可以使用foreach
枚举它们。
答案 4 :(得分:0)
我为此做了一个小测试应用程序,我将你的xml包含在字符串中。
var xmlMessage = @"keep your xml here, I removed due to formatting";
var matchedElements = XDocument.Parse(xmlMessage).Descendants().Where(el => el.Name == "LO" && el.Attribute("ID").Value == "_id_code1");
foreach (var el in matchedElements)
{
Console.WriteLine("ElementName : {0}\nID = {1}\nLANG = {2}\nTYPE = {3}\nTITLE = {4}\n"
, el.Name.LocalName, el.Attribute("ID").Value, el.Attribute("LANG").Value, el.Attribute("TYPE").Value, el.Attribute("TITLE").Value);
}
这将帮助您获取具有ID“_id_code”的所有LO元素,而不管GROUP元素如何。 如果您需要考虑该组,请将第二行代码替换为:
var matchedElements = XDocument.Parse(xmlMessage).Descendants().Where(el => el.Parent != null && el.Parent.Attribute("ID").Value == "_group_id_2" && el.Name == "LO" && el.Attribute("ID").Value == "_id_code1");
在这里,我正在检查“_group_id_2”,您可以使用您的群组ID替换。
所需的命名空间:
using System.Linq;
using System.Xml;
using System.Xml.Linq;