0

我相信我越来越XDocument困惑XElement。我在尝试着:

  1. 加载一个 xml 文件
  2. 查询元素名称的属性
  3. 将找到的元素的各个方面写入结构。

简单结构,称为Rule

public struct Rule
{
    public String keyDB;
    public String eventLog;
}

XML结构:

<?xml version="1.0" encoding="utf-8" ?>
<Error_List>
  <Error code="0xC004C003">
      <KeyDB>
        default key
      </KeyDB>
      <EventLog>
        default event
      </EventLog>
  </Error>
  <Error code="000000000">
      <KeyDB>
        non-default key
      </KeyDB>
      <EventLog>
        non-default event
      </EventLog>
  </Error>
</Error_List>

设置Rule rule = new Rule()
如果我传入我的方法"000000000",我希望设置rule.keyDB = "non-default key"rule.eventLog = "non-default event". 我很确定这是可能的,但我只是把我的变量搞混了。

编辑:
到目前为止,我的代码不成功且不完整。我有

IEnumerable<XElement> query =   (from elem in rulesXml.Root.Elements("Error")
                                where (String)elem.Attribute("code") == this.errorCode.ToString()
                                select elem);

但我不确定从那里去哪里。

4

2 回答 2

3

一旦您掌握了 Linq,Linq-to-XML 就非常强大并且非常容易理解。你可以找到很多关于这两个主题的教程。

这是您可以执行的操作:

string myCode = "000000000";  // Error Code to find
XDocument xDocument = XDocument.Load("C:/Path to the file.xml");  // Loads the Xml file to a XDocument

Rule rule = (from errorNode in xDocument.Descendants("Error")    // Go through Error elements
             where errorNode.Attribute("code").Value == myCode   // That has the specified code attribute
             select new Rule
             {
                 keyDB = errorNode.Element("KeyDB").Value,       // Gets the KeyDB element value of the Error node
                 eventLog = errorNode.Element("EventLog").Value  // Gets the EventLog element value of the Error node
             }).FirstOrDefault();

更新

如果一个Error元素可以没有代码属性或没有KeyDBEventLog属性。使用显式类型转换来检索它们的值。IE。而不是写Element.Attribute("...").Valuewrite (string)Element.Attribute("...")(相同Element("...")

Rule rule = (from errorNode in xDocument.Descendants("Error")      // Go through Error elements
             where (string)errorNode.Attribute("code") == myCode   // That has the specified code attribute
             select new Rule
             {
                 keyDB = (string)errorNode.Element("KeyDB"),       // Gets the KeyDB element value of the Error node
                 eventLog = (string)errorNode.Element("EventLog")  // Gets the EventLog element value of the Error node
             }).FirstOrDefault();
于 2013-07-22T16:49:45.733 回答
0

尝试使用 ILookup:

Error code设置为 的键lookup

public struct Rule
{
    public String keyDB;
    public String eventLog;
}

class Program
{
    static void Main(string[] args)
    {
        XDocument xdoc = XDocument.Load("src.xml");

        ILookup<string, Rule> lookup = xdoc.Descendants("Error").ToLookup(x => x.Attribute("code").Value, x => new Rule() { keyDB = x.Element("KeyDB").Value, eventLog = x.Element("EventLog").Value });

        //Perform operation based on the error code from the lookup

        Console.Read();
    }
}
于 2013-07-22T17:08:09.813 回答