2016-09-22 7 views
0

XMLツリーのすべての要素をどのように反復処理してアクセスするのですか?私が意味することは、入力が未知のXMLファイルを取得し、コード自体が要素と枝の数を知らないということです。XMLファイルを反復処理する方法

私はそのようなトピックに関する多くの答えがあったことを知っています。このソリューションは、既知の構造体xmlがどこにあるのかをコードを実装する準備ができています。今私は、反復によってexisitngノードにいくつかの要素を追加する方法

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."); 
    } 

これは私が使用しているコードのですか?それが可能だ ?

+1

として再書き込みする必要があることに注意してください。 。 XMLDocumentまたはXPATHDocumentを使用できます。または、LINQの場合、XMLを読むことができるXDocumentを使用します。 – A3006

+0

あなたが達成しようとしていることを正確に知るのに役立つかもしれません。 – PaulF

+0

私はツリーxmlのすべての要素を反復するメソッドが必要です。この考え方は、xmlファイルのさまざまなブランチで汎用的にコードを動作させることです。 –

答えて

0

@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(); 

希望します。

が、これは一般的な答えは、あなたが可能なものの、XMLのスキーマは、知られていない場合、それはコードのあまりのようになりますあなたのニーズあたり

+0

[OK]を、ので、私はあなたが表示されます:そして、あなたは私たちは、この同じノード3回を持っている参照してください。私は(2番目のノード)に要素を追加したいのですが、2番目のノードでをどのように参照できますか? –

+0

@MikeEvans - 次のいずれかがない限りこれは不可能です。1) "authors"要素のIDまたは2)正確な場所(2ndのような) – A3006

+0

常に2番目のノードであることが確かであればカウンターが2に達するとループが作成され、変更されます。ただし、IDが "authors"の属性として正しいアプローチになります。 – A3006