* [UPDATED] *我有一个非常复杂的XML,我曾经使用PowerBuilder和PBDOM进行解析。
我需要使用C#编写一个解析器作为Windows服务。
我已经阅读了很多教程,但它们基于非常简单的示例,其中包含一个或两个级别的XML。
我需要你对这种方法的帮助。我在这里放了一个非常小的样本。这是一个非常庞大的XML模式的一部分,但如果我了解如何在.NET中使用它,我可以应付其余部分。
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<OTA_ResRetrieveRS xmlns="http://www.opentravel.org/OTA/2003/05" EchoToken="echo" TimeStamp="2013-11-11T16:50:20.476" Version="1.0">
<Success/>
<ReservationsList>
<HotelReservation CreateDateTime="2013-11-08T20:17:52" ResStatus="Book">
<UniqueID ID="O0" Type="414"/>
<POS>
<Source>
<RequestorID ID="SX" Type="212"/>
我的代码
XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace("df", "http://www.opentravel.org/OTA/2003/05");
XmlNodeList ReservationsListList = doc.GetElementsByTagName("ReservationsList");
for (int a = 0; a < ReservationsListList.Count; a++)
{
XmlNodeList HotelReservationList = ReservationsListList[a].SelectNodes("//df:HotelReservation",mgr);
for (int b = 0; b < HotelReservationList.Count; b++)
{
XmlNodeList UniqueIDList = HotelReservationList[b].SelectNodes("/df:UniqueID", mgr);
for (int c = 0; c < UniqueIDList.Count; c++)
{
string UniqueIDID = UniqueIDList[c].Attributes.GetNamedItem("ID").Value;
string UniqueIDType = UniqueIDList[c].Attributes.GetNamedItem("Type").Value;
}
XmlNodeList UniqueIDList2 = HotelReservationList[b].SelectNodes("/df:POS", mgr);
for (int c = 0; c < UniqueIDList2.Count; c++)
{
XmlNodeList SourceList = UniqueIDList2[c].SelectNodes("/df:Source", mgr);
for (int d = 0; d < SourceList.Count; d++)
{
XmlNodeList RequestorIDList = SourceList[d].SelectNodes("/RequestorID");
for (int f = 0; f < RequestorIDList.Count; f++)
{
string RequestorIDID = RequestorIDList[f].Attributes.GetNamedItem("ID").Value;
string RequestorIDType = RequestorIDList[f].Attributes.GetNamedItem("Type").Value;
}
}
}
}
}
}
假设XML中有 20个HotelReservation 元素。每个人在 UniqueID 元素中都有一个 ID 和一个 Type 。
当我在第一个HotelReservation 中循环 UniqueID 时,它会循环 20次,为我提供所有 ID 和XML的类型!
我用/替换了//我得空了!
你可以帮我发现错误吗?提前完成