2016-10-28 14 views
0

私は書き込みしようとしているプログラムに少し問題があります。別のプログラムで生成されたXMLファイルを使用しているので、書式は常に同じですが、セクション内のセクションとデータの数は異なります。私は普遍的なものにしようとしています。ここでC#LINQとXMLを別々のセクションで解析する

は、サンプルのXMLです:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml.Linq; 

namespace XMLParseDev 
{ 
    class XMLParseDev 
    { 
     static void Main(string[] args) 
     { 
      int sectionCount = 0; 
      Console.WriteLine(sectionCount); 

      XDocument xDoc = XDocument.Load(@"C:\Users\test.xml"); 
      //XElement xEle = XElement.Load(@"C:\users\test.xml"); 
      //Application winWord = new Application(); 

      IEnumerable<XElement> xElements = xDoc.Elements(); 
      IEnumerable<XElement> xSectionCount = from xSections in xDoc.Descendants("section") select xSections; 
      IEnumerable<XElement> xthCount = from xth in xDoc.Descendants("th") select xth; 

      foreach (XElement s in xSectionCount) 
      { 
       //This is to count the number of <section> tags, this part works 
       sectionCount = sectionCount + 1; 

       //This was trying to write the value of the <h1> tag but does not 
       IEnumerable<XElement> xH1 = from xH1Field in xDoc.Descendants("h1") select xH1Field; 
       Console.WriteLine(xH1.Attributes("h1")); 

       foreach (XElement th in xthCount) 
       { 
        //This was supposed to write the <th> value only for <th> within the <section> but writes them all 
        Console.WriteLine(th.Value); 
       } 
      } 
      Console.WriteLine(sectionCount); 
     } 
    } 
} 

そして出力:

0 
System.Xml.Linq.Extensions+<GetAttributes>d__1 
Field 
Value 
Field 
Value 
VM Name 
RAM Usage 
System.Xml.Linq.Extensions+<GetAttributes>d__1 
Field 
Value 
Field 
Value 
VM Name 
RAM Usage 
2 

<?xml version="1.0" encoding="utf-8" ?> 
<hcdata> 
    <docTitle>Test Health check</docTitle> 
    <sections> 
    <section id="1" name="server-overview"> 
     <h1>Server Overview</h1> 
     <table name="server1"> 
     <th>Field</th> 
     <th>Value</th> 
     <tr> 
      <td>Name</td> 
      <td>TestESXI1</td> 
     </tr> 
     <tr> 
      <td>RAM</td> 
      <td>24GB</td> 
     </tr> 
     </table> 
     <table name="server2"> 
     <th>Field</th> 
     <th>Value</th> 
     <tr> 
      <td>Name</td> 
      <td>TestESXI2</td> 
     </tr> 
     <tr> 
      <td>RAM</td> 
      <td>16GB</td> 
     </tr> 
     </table> 
    </section> 
    <section id="2" name="vms"> 
     <h1>Virtual Machine Information</h1> 
     <table name="vminfo"> 
     <th>VM Name</th> 
     <th>RAM Usage</th> 
     <tr> 
      <td>2K8R2</td> 
      <td>2048MB</td> 
     </tr> 
     <tr> 
      <td>2K12R2</td> 
      <td>4096Mb</td> 
     </tr> 
     </table> 
    </section> 
    </sections> 
</hcdata> 

そして、ここでは、私は値を試してみて、引っ張っていじりされているいくつかのC#コードであります

基本的に私がしたいのは、XMLをWord文書に変換することです(この質問はWord部分についてではなく、単にdatゲット)。私はHTMLに似たタグを使用して設計の容易さを助けました。
<section>タグを個別の部品として処理する必要があります。 私は実行を計画しているので、テーブルの行と列の数を得ることができるので、テーブルを作成してからデータを取り込むことができます(最初にテーブルを正しい次元で作成する必要があるため)。
セクションにも見出し(<h1>)があります。

私は、このセクションをループするforeachになるループとしてこの計画を立てていましたが、繰り返しでこのセクション内の他のすべてを実行しますが、データ選択を特定のセクションだけにロックする方法はわかりません。

これは意味があり、事前に感謝します。

答えて

1

DataSetでデータを解析してデータテーブルからデータを取り出せるようにする方が簡単かどうかは疑問です。 xmlファイルを読み込んで、すべてのデータを表として表示する小さなスニペットを次に示します。

DataSet ds = new DataSet(); 
ds.ReadXml("xmlfile2.xml"); 
foreach(DataTable dt in ds.Tables) 
{ 
    Console.WriteLine($"Table Name - {dt.TableName}\n"); 
    foreach(DataColumn dc in dt.Columns) 
    { 
     Console.Write($"{dc.ColumnName.PadRight(16)}"); 
    } 
    Console.WriteLine(); 
    foreach(DataRow dr in dt.Rows) 
    { 

     foreach(object obj in dr.ItemArray) 
     { 
      Console.Write($"{obj.ToString().PadRight(16)}"); 
     } 
     Console.WriteLine(); 
    } 
    Console.WriteLine(new string('_', 75)); 
} 
+0

ありがとう、私はこれを見て – DC5039