2017-11-28 5 views
0

私はXMLファイルに関する多くの経験はありませんが、自分のニーズに合わせてオンラインで見つけたチュートリアルを追加しようとしています。XML要素の値を選択する

https://support.microsoft.com/en-us/help/307548/how-to-read-xml-from-a-file-by-using-visual-c

私は周りに検索したが、私が見つけたすべては私には意味がありません。

私のXMLは、ほとんどの部分は次のようになります。

<US> 
    <!-- Kentucky Start --> 
    <State>Kentucky KY 
     <City>Newport 
      <Street>Pavilion Parkway<Number>130<PostalCode>41071</PostalCode></Number></Street> 
     </City> 
     <City>Corbin 
      <Street>Highway 90<Number>7351<PostalCode>40701</PostalCode></Number></Street> 
     </City> 
    </State> 
</US> 

私は各状態の値を持つリストボックスを移入しようとしているが、私のコードのいずれかは、XMLタグ内の空白またはテキストだけを返します。

状態.. 状態..各要素に対して が繰り返されます。

  while (reader.Read()) { 
       switch (reader.NodeType) { 

        case XmlNodeType.Element: // The node is an element. 

         // Skip over root element 
         if (reader.Name.Equals("US")) { 

          reader.MoveToNextAttribute(); 

         } 
         else { 

          if(reader.Name.Equals("State")) { 
           lbState.Items.Add(reader.Name); 
           lbState.Items.Add(reader.Value); 
          } 

         } 
         break; 

reader.Name戻っ「状態」 reader.Valueは「空白」を返し

reader.ValueはケンタッキーKYを返さない理由を私は理解していない... 私は他の例を見てきましたそれは文字列ビルダーを使用して、これは悪いアプローチですか?

+1

あなたが本当に 'XmlReader'を使用する必要が何らかの理由はありますか? LINQ to XML( 'XDocument'など)を使用してドキュメント全体をメモリにロードするのは、通常はずっと簡単です。 –

+0

私はこの問題を回避しようとします。 'XmlReader' APIは本当に親切ではありません... – royalTS

+0

特別な理由はありません。前にも触れましたが、XMLやXMLファイルの読み込みはほとんど経験していません。私はチュートリアルをコンソールアプリケーションで作業させるだけで済みました。お勧めはありますか?私は大いに感謝しています。 – shockemc

答えて

1

使用reader.ReadString()代わりreader.Value

+0

魅力的なように働いてくれてありがとうございます。私はおそらく他の答えの1つを使用しますが、技術的にはこれは質問されたように私の質問に答えました。 – shockemc

+1

大きなXmlで高性能であるため、XmlReaderに固執することをお勧めします。 (これはSAXパーサのように、早送りのみです) – Sunil

1

てみたXML LINQ:

sing System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      var results = doc.Descendants("State").Select(x => new { 
       cities = x.Elements("City").Select(y => new { 
        state = (string)x, 
        city = (string)y, 
        streets = y.Elements("Street").Select(z => (string)z).ToList() 
       }).ToList() 
      }).SelectMany(x => x.cities).ToList(); 
     } 
    } 
} 
+0

これはどのようにリストボックスに追加されますか? – shockemc

+0

私は結果の印刷作業を意味しますが、州と都市を別々に印刷するにはどうすればよいですか? – shockemc

+0

結果を列挙して値を得ることができますforeach(結果にvar結果) – jdweng

1

のあなたはXmDocumentを使用します(参照:https://msdn.microsoft.com/en-us/library/system.xml.xmldocument(v=vs.110).aspx)をすることができ、その後、あなたの文書から右の要素を取得するために、XPath式を使用します。

また、次のように状態の名前をカプセル化する方がいいです(つまり、xmlドキュメントを所有している場合)。

<name>Kentucy KY</name> 

だからあなたは、次の操作を行うことができます。

var items = new List<string>(); 

XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.LoadXml("yourxml"); 
var xmlNodes = xmlDocument.SelectNodes("//State/Name"); 
foreach (XmlNode node in xmlNodes) 
{ 
    items.Add(xmlNode.Value); 
}