2016-01-13 79 views
0

請考慮下面的示例XML。我有一個類說包含兩個字段X和Y的虛擬。通過XML解析我想建立該類的對象的列表。 X和Y分別取值於僅在B父節點內的X和Y標籤。在XML中,X和Y節點可能存在或不存在於B節點內。XML解析時,節點可能會或可能不存在

<DOC> 
    <A>1</A> 
    <B> 
    <C>1</C> 
    <D>1</D> 
    <E>1</E> 
    <X>Hello</X> 
    <F>1</F> 
    <G>1</G> 
    <Y>Hi</Y> 
    </B> 
    <B> 
    <C>1</C> 
    <D>1</D> 
    <E>1</E> 
    <F>1</F> 
    <G>1</G> 
    </B> 
<H> 
    <X>1</X> //ignore 
    <Y>1</Y> //ignore 
</H> 
<DOC> 

對於上面的XML,我想列出包含兩個元素的列表。第一組將有「你好」,「你好」,另一組將有「」,「」

我的C#解析代碼看起來是這樣的

List<Dummy> dummyList = new List<Dummy>(); 
Dummy d = null; 

while (xmlReader.Read()) 
     { 
      if (xmlReader.IsStartElement()) 
      { 
       switch (xmlReader.Name) 
       { 
        case "B": 
          d = new Dummy(); 
          while(xmlReader.Name != "X") 
           xmlReader.Read(); // can go into infinite loop if there is no X node 
          xmlReader.Read(); 
          d.X = xmlReader.Value; 

          while(xmlReader.Name != "Y") 
           xmlReader.Read(); // can go into infinite loop if there is no Y node 
          xmlReader.Read(); 
          d.Y = xmlReader.Value; 

          dummyList.Add(d); 
          d = null; 
          break; 
       } 
     } 
} 

上面代碼中的第一個B節點工作正常但不是第二個B節點。 請讓我知道你的想法。

+0

道瓊斯指數也驗證碼失敗?請提供。 –

+0

在您的源代碼中,您首先搜索「X」,之後搜索「Y」。你故意這樣做嗎? –

回答

0
bool waitingForXy = false; 
while (xmlReader.Read()) 
{ 
    if (xmlReader.IsStartElement()) 
    { 
     switch (xmlReader.Name) 
     { 
      case "B": 
       d = new Dummy(); 
       waitingForXy = true; 
       break; 
      case "X": 
       if (waitingForXy) 
       { 
        d.X = xmlReader.ReadString(); 
       } 
       break; 
      case "Y": 
       if (waitingForXy) 
       { 
        d.Y = xmlReader.ReadString(); 
       } 
       break; 
     } 
    } 
    else if (xmlReader.NodeType == XmlNodeType.EndElement) 
    { 
     switch (xmlReader.Name) 
     { 
      case "B": 
       waitingForXy = false; 
       dummyList.Add(d); 
       break; 
     } 
    } 
} 

這將創建的每一個<B>開始元素上的虛擬實例,並等待<X><Y>出現,直到</B>末元素。如果他們不發生,d.Xd.Y將保持爲空。

+0

謝謝!!! <3 –

0

你的意思是它未能爲第二個B節點。

正如我在第二個B節點看你沒有任何X或Y這意味着當它得到的內部開關和案例,直到找到X不存在任何更多的「B」啓動while循環。所以它直到結束,沒有任何反應。你必須閱讀直到B節點結束(這將確保你無限循環),如果沒有X和Y,你必須爲它們手動創建空字符串。

0

如果你正在使用VS2013 SP2或更高版本,可以使用Edit->Paste Special->Paste XML As Classes的強類型類從原始XML複製並粘貼到你的代碼。請注意,您必須關閉最後的</DOC>並刪除評論才能使用!

然後,您可以使用下面的代碼中提取從XML任何燒烤任何X和Y值成元組的集合:

string xml = // TODO: Get XML as string. 
var myXml = (DOC)new XmlSerializer(typeof(DOC)).Deserialize(new StringReader(xml)); 
var results = myXml.B.Select(x => Tuple.Create(x.X, x.Y)); 
相關問題