2013-05-14 102 views
1

我需要在不知道标签名称的情况下读取XML文件。 目前我正在使用Xelement.I需要找到一个有效的方法来制作此程序。 我的XML:在不知道标签名称的情况下读取xml文件

<Actions> 
<Action Name="Action1" ID="AE6ECD81-6CC1-4A05-B379-113D700BD1A9"> 
    <Trigger Name="alo"> 
     <And> 
      <Checked ID="3897D8C6-873F-45AD-8D28-1A80B8AC5CBD" Parameter="Attribute" Value="Checked"/> 
      <Checked ID="B1BA57CD-BFAF-4C52-8686-F7073F68EF71" Parameter="Attribute" Value="unchecked"/> 
     </And> 
    </Trigger> 
    <Command> 
     <True> 
      <Do ID="F9129376-DCDE-4964-8B5C-DF0EF8886AB9" Parameter="Visible" Value="True"/> 
      <Do ID="456627B0-8195-459C-981F-7450866CE635" Parameter="Visible" Value="True"/> 
     </True> 
    </Command> 
</Action> 
<Action Name="Action2" ID="5E7809FF-FEAB-48F2-9F18-0E67F514AFB2"> 
    <Trigger> 
     <Or> 
      <Checked ID="3897D8C6-873F-45AD-8D28-1A80B8AC5CBD" Parameter="Attribute" Value="Checked"/> 
      <Checked ID="B1BA57CD-BFAF-4C52-8686-F7073F68EF71" Parameter="Attribute" Value="unchecked"/> 
     </Or> 
    </Trigger> 
    <Command> 
     <True> 
      <Do ID="F9129376-DCDE-4964-8B5C-DF0EF8886AB9" Parameter="Visible" Value="True"/> 
      <Do ID="456627B0-8195-459C-981F-7450866CE635" Parameter="Visible" Value="True"/> 
     </True> 
    </Command> 
</Action> 

我的C#代码:

public override void LoadFromXml(string XmlFileAddress) 
    { 
     XDocument doc = XDocument.Load(XmlFileAddress); 
     var actions = doc.Descendants("Action").ToList(); 
     foreach (var a in actions) 
     { 
      xmlstring = a.ToString(); 
      Atcion hta = new Atcion(); 
      hta.LoadFromXml(xmlstring); 
      ActionList.Add(hta); 
     } 
    } 

    List<Trigger> TriggerList = new List<Trigger>(); 
    List<Command> CommandList = new List<Command>(); 
    string actname; 
    string actID; 
    string trigname; 
    string actype; 
    public override void LoadFromXml(string XmlFileAddress) 
    { 
     string xmlstr = ""; 
     XElement elem = XElement.Parse(XmlFileAddress);    
     actID = elem.Attribute("ID").Value; 
     actname = elem.Attribute("Name").Value; 
     var triggers = elem.Descendants("Trigger").ToList();       
     foreach (var t in triggers) 
     { 
      trigname = t.Attribute("Name").Value; 
      actype = t.Element("And").Name.LocalName; 
      var chaction = t.Descendants("And").ToList();     
      foreach (var c in chaction) 
      { 
       Trigger tri = new Trigger(); 
       xmlstr = c.ToString(); 
       tri.LoadFromXml(xmlstr); 
       TriggerList.Add(tri); 
      } 
     } 

,我有是,我需要知道在XML标签的名称实际上唯一的问题。 如果有人告诉我如何在不知道名称的情况下阅读标签并为我提供了一种有效的方法,我将非常感激。

+2

如果您不知道标签的名称,那么您如何找出该标签上的*语义*值,然后将其分配给对象的相应属性? – Tigran 2013-05-14 06:42:12

+0

你有没有试过SAX解析器?它将触发发现的元素和属性事件,并为您提供标签的名称。 – 2013-05-14 06:45:39

+1

如果您不知道标签的名称 - 您可以简单地遍历所有标签,例如'XElement.Elements()'。但是,正如Tigran所提到的,这是没有意义的,因为你不知道如何真正解释这些标签和它们的值,没有_some_之前的知识库(除非你想要做的就是将这些标签添加到一些'Dictionary '或w/e) – 2013-05-14 06:52:36

回答

1

我假设你有ActionTriggerCommand先验知识,并要动态分析的操作。

var xDoc = XDocument.Load(filename); 

var actions = xDoc.Descendants("Action") 
        .Select(action => new 
        { 
         Name = action.Attribute("Name").Value, 
         Trigger = new 
         { 
          Name = (string)action.Element("Trigger").Attribute("Name"), 
          Conditions = action.Element("Trigger") 
              .Elements().First() 
              .Elements() 
              .Select(e => new{ 
               Name = e.Parent.Name.LocalName, 
               Attributes = e.Attributes().ToDictionary(a=>a.Name.LocalName,a=>a.Value) 
              }) 
              .ToList() 

         }, 
         Command = new 
         { 
          Name = (string)action.Element("Trigger").Attribute("Name"), 
          Do = action.Element("Command") 
             .Elements().First() 
             .Elements() 
             .Select(e => new 
             { 
              Name = e.Parent.Name.LocalName, 
              Attributes = e.Attributes().ToDictionary(a => a.Name.LocalName, a => a.Value) 
             }) 
             .ToList() 

         }, 
        }) 
        .ToList(); 
1

我不知道如何在不知道语义的情况下解释xml,但下面的方法遍历整个文档,而不知道元素。

public void ProcessXml(string XmlFileAddress) 
{ 
    XDocument doc = XDocument.Load(XmlFileAddress); 

    ReadXElement(doc.Root); 
} 

private void ReadXElement(XElement xElement) 
{ 
    foreach (var attribute in xElement.Attributes()) 
    { 
     Console.WriteLine(attribute.Name + " - " + attribute.Value); 
    } 

    foreach (var childElement in xElement.Elements()) 
    { 
     ReadXElement(childElement); 
    } 
} 

结果是:

enter image description here

相关问题