2016-06-28 25 views
-2

私はC#visual studioでxmlを読み込もうとしていましたが、それをうまくやる方法がわかりませんでした。まず、次のようにifブロックを試しました。xmlファイルの読み方(簡単)

if (ReadToNextDescendant("painted_blue")) 
{ 
    // access the coordinates inside and do some work 
    // this works 
} 

これはうまくいって、塗られた青色の座標からデータを抽出できました。しかし、私は再びwall_horizo​​ntalを試してみましたが、うまくいきませんでした。こうして、私はある種の新しい機能、あるいは別のアプローチが必要であると結論づけました。しかし、私はXMLパースに精通していません。一つのこととして、私はReadToDescendantが何をしているのか、それがなぜ二回目にはうまくいかなかったのかを正確には理解していません。誰かが私を正しい方向に向けることができますか?

<painted_blue> 
    (0,0) 
    (1,0) 
    (1,5) 
    (2,2) 
</painted_blue> 

<walls_horizontal> 
    (1,2) 
    (1,3) 
    (1,4) 
    (2,1) 
    (2,2) 
</walls_horizontal> 

<walls_vertical> 
    (1,1) 
    (1,2) 
    (1,3) 
    (2,0) 
    (2,1) 
</walls_vertical> 

+9

'ReadToNextDescendant'はあなたが何かで呼び出されていないので、自分のクラスのメソッドのようです。あなたが[mcve]を提供するなら、それは本当に役に立ちます。しかし、一般的には、XMLを扱う際にLINQ to XMLを使用することをお勧めします。あなたのXMLの現在の構造は本当に残念です - それらの要素のそれぞれに5つのサブ要素があるように見えます。 –

+1

XElementクラスを検索します。このようなことには非常に便利で、Lonq to XMLについてXMLを話すときにJon Skeetが言及しているものの一部です。また、Jon Skeet氏が述べたように、XMLを修正して、それらの座標がおそらくx属性とy属性を持つサブ要素であることを考慮する必要があります。 – Jakotheshadows

+0

注目に値すると、追加:あなたのXMLは有効なXMLではありません。 –

答えて

1

あなたは私は本当にこのような何かにXML形式を変更することをお勧めすることができます場合は、次のようになります座標のための

<walls_horizontal> 
    <coord x="1" y="2" /> 
    <coord x="1" y="3" /> 
    <coord x="1" y="4" /> 
</walls_horizontal> 

持つノードは、はるかに簡単です管理する。次にん

public Coord(XmlReader reader) 
    { 
     if (reader == null) throw new ArgumentNullException("reader"); 

     if (!reader.IsEmptyElement) 
     { 
      string tagName = reader.Name; 

      while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement && reader.Name == "coord")) 
      { 
       if (reader.NodeType == XmlNodeType.Element) 
       { 
        switch (reader.Name) 
        { 
         case "coord": 
          var x = reader.GetAttribute("x"); 
          var y = reader.GetAttribute("y"); 
          break; 
        } 
       } 

     } 
     } 
    } 

:ここ

は、いくつかのコードは、クラスの座標カスタムでファイルに

Stream stream = File.Open(filePath, FileMode.Open); 

    var reader = XmlReader.Create(stream, XmlHelper.ReaderSettings()); 



    if (!reader.IsEmptyElement) 
      { 
       string tagName = reader.Name; 

       while (reader.Read() && !(reader.NodeType == XmlNodeType.EndElement)) 
       { 
        if (reader.NodeType == XmlNodeType.Element) 
        { 
         switch (reader.Name) 
         { 
          case "wall_horizontal": 
           var coord = new Coord(reader); 
           break; 

         } 
        } 
       } 
      } 

を読んで、これまで

public static XmlReaderSettings ReaderSettings() 
{ 
    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.CloseInput = true; 
    settings.IgnoreComments = true; 
    settings.IgnoreProcessingInstructions = true; 
    settings.IgnoreWhitespace = true; 
    return settings; 
} 

は...のような何かをしていますxとyの値を持つもの。このコードは、私が使用するボイラープレートです。あなたの状況に合わせてコードを修正する必要があるかもしれません。私はそれが正しい方向にあなたを指すことを願っています!

関連する問題