如何迭代XML文件

问题描述:

如何迭代XML树的所有元素并访问它们?我的意思是输入得到未知的xml文件,并且它迭代的代码本身不知道元素和分支的数量。如何迭代XML文件

我知道这是很多关于这些主题的答案,并且该解决方案已准备好实现代码,其中已知结构xml。

这是我使用的是代码:

class Program 
{ 
    static void Process(XElement element) 
    { 
     if (!element.HasElements) 
     { 
      Console.WriteLine(element.GetAbsoluteXPath()); 
     } 
     else 
     { 
      foreach (XElement child in element.Elements()) 
      { 
       Process(child); 
      } 
     } 
    }} 

static void Main() 
    { 



     var doc = XDocument.Load("C:\\Users\\Błażej\\Desktop\\authors1.xml"); 
     List<string> elements = new List<string>(); 
     Program.Process(doc.Root); 

      Console.ReadKey(); 

} 
public static class XExtensions 
{ 
    public static string GetAbsoluteXPath(this XElement element) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 
     Func<XElement, string> relativeXPath = e => 
     { 
      int index = e.IndexPosition(); 
      string name = e.Name.LocalName; 

      return (index == -1) ? "/" + name : string.Format 
      (
       "/{0}[{1}]", 
       name, 
       index.ToString() 
      ); 
     }; 

     var ancestors = from e in element.Ancestors() 
         select relativeXPath(e); 

     return string.Concat(ancestors.Reverse().ToArray()) + 
       relativeXPath(element); 
    } 

    public static int IndexPosition(this XElement element) 
    { 
     if (element == null) 
     { 
      throw new ArgumentNullException("element"); 
     } 

     if (element.Parent == null) 
     { 
      return -1; 
     } 

     int i = 1; 

     foreach (var sibling in element.Parent.Elements(element.Name)) 
     { // czyli patrzymy na rodzeństwo, czy występują podobne np. au_id[1], au_id[2] 
      if (sibling == element) 
      { 
       return i; 
      } 
      else 
      { 
       i++; 
      } 


     } 

     throw new InvalidOperationException 
      ("element has been removed from its parent."); 
    } 

现在,我怎么一些元素通过迭代添加到exisitng节点?这是可能的 ?

+1

如果XML的架构尚不清楚,但有可能,它会像太多的代码。您可以使用XMLDocument或XPATHDocument。或者在LINQ中使用XDocument,它可以让你读取XML。 – A3006

+0

这可能有助于确切知道你想达到的目标。 – PaulF

+0

我需要一个迭代树xml的所有元素的方法。这个想法是使代码在xml文件中的各个分支上通用。 –

正如@strongbutgood提到的,这是非常通用的。 可能低于通用代码帮助

Dim xdoc As New XDocument(); 
xdoc = XDocument.Parse(myXML); 

// Adding new element 
xdoc.Element(<Your_Parent_Node_Name>).Add(new XElement("<New_Element_Name>", "<New_Element_Value>")); 

// Deleting existing element 
xdoc.Descendants().Where(s =>s.Value == "<Element_To_Be_Removed>").Remove(); 

希望这有助于。

请注意,这是一个通用的答案,你将需要重新写,按您的需求

+0

好了,我会告诉你:你可以看到,我们有这个相同的节点3倍。我想将元素添加到(在第二个节点中),我如何在第二个节点中引用? –

+0

@MikeEvans - 这是不可能的,除非你有下列其中一项:1)“authors”元素的ID或2)确切的位置(如2nd) – A3006

+0

如果你确定它永远是第二个节点,你可以在循环并在计数器遇到2时进行更改。但将ID作为“作者”的属性将是正确的方法。 – A3006