在 C# Windows 表单中使用 GetElementsByTagName 与 XML
Using GetElementsByTagName in C# Windows Form with XML
我正在从安全网站加载 xml 页面,我想用 Xml 文档阅读该页面。
xml的一部分:
<ActueleVertrekTijden>
<VertrekkendeTrein>
<RitNummer>5070</RitNummer>
<VertrekTijd>2015-03-20T19:42:00+0100</VertrekTijd>
<EindBestemming>Den Haag Centraal</EindBestemming>
<TreinSoort>Sprinter</TreinSoort>
<RouteTekst>Lage Zwaluwe, Dordrecht, Rotterdam C.</RouteTekst>
<Vervoerder>NS</Vervoerder>
<VertrekSpoor wijziging="false">6</VertrekSpoor>
</VertrekkendeTrein>
<VertrekkendeTrein>
<RitNummer>1971</RitNummer>
<VertrekTijd>2015-03-20T19:50:00+0100</VertrekTijd>
<EindBestemming>Venlo</EindBestemming>
<TreinSoort>Intercity</TreinSoort>
<RouteTekst>Tilburg, Eindhoven, Helmond</RouteTekst>
<Vervoerder>NS</Vervoerder>
<VertrekSpoor wijziging="false">4</VertrekSpoor>
<Opmerkingen> // This is not always available, but it is important and specific for a 'VertrekkendeTrein'
<Opmerking>Rijdt vandaag niet</Opmerking>
</Opmerkingen>
</VertrekkendeTrein>
现在我使用以下代码:
string urlo = "the website";
string resultje = HttpGeto(urlo);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(resultje);
XmlNodeList ns = xmlDoc.GetElementsByTagName("VertrekkendeTrein");
//MessageBox.Show(ns[0].InnerXml); //*This part works it shows the xml inside the first "VertrekkendeTrein"*
//*Now I want to read all the items of ns[0] and split it like: GetElementsByTagName("RouteTekst")*
XmlDocument xd1 = new XmlDocument();
xd1.LoadXml(ns[0].InnerXml);
XmlNodeList nsvertrektijdje = xd1.GetElementsByTagName("RouteTekst");
var vty1 = nsvertrektijdje[0].InnerText;
MessageBox.Show(vty1);
我现在遇到的问题是我无法在 LoadXml 中加载 ns[0].InnerXml。没有结果。
编辑:
现在我使用的是:
string urlo = "website";
string resultje = HttpGeto(urlo);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(resultje);
XmlNodeList ns = xmlDoc.GetElementsByTagName("VertrekkendeTrein");
var element = ns[0] as XmlElement;
XmlNodeList nsvertrektijdje = element.GetElementsByTagName("RouteTekst");
var vty1 = nsvertrektijdje[0].InnerText;
MessageBox.Show(vty1);
但是还是不行
您不能使用 InnerXml
,因为它不包含 VertrekkendeTrein
节点,所以它不是有效的 xml 文档(一个文档只能有一个根节点)。您可以使用 OuterXml
,但这很浪费,因为您已经解析了 XML.
这里最好的方法是将 XmlNode
转换为 XmlElement
并从中使用 GetElementsByTagName
方法。
var element = ns[0] as XmlElement;
XmlNodeList nsvertrektijdje = element.GetElementsByTagName("RouteTekst");
完整代码现在如下所示:
var xml = @"<ActueleVertrekTijden>
<VertrekkendeTrein>
<RitNummer>5070</RitNummer>
<VertrekTijd>2015-03-20T19:42:00+0100</VertrekTijd>
<EindBestemming>Den Haag Centraal</EindBestemming>
<TreinSoort>Sprinter</TreinSoort>
<RouteTekst>Lage Zwaluwe, Dordrecht, Rotterdam C.</RouteTekst>
<Vervoerder>NS</Vervoerder>
<VertrekSpoor wijziging=""false"">6</VertrekSpoor>
</VertrekkendeTrein>
<VertrekkendeTrein>
<RitNummer> 1971 </RitNummer>
<VertrekTijd> 2015 - 03 - 20T19: 50:00 + 0100 </VertrekTijd >
<EindBestemming> Venlo </EindBestemming>
<TreinSoort> Intercity </TreinSoort>
<RouteTekst> Tilburg, Eindhoven, Helmond </RouteTekst>
<Vervoerder> NS </Vervoerder>
<VertrekSpoor wijziging = ""false""> 4 </VertrekSpoor>
<Opmerkingen> // This is not always available, but it is important and specific for a 'VertrekkendeTrein'
<Opmerking> Rijdt vandaag niet</Opmerking>
</Opmerkingen>
</VertrekkendeTrein></ActueleVertrekTijden>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
XmlNodeList ns = xmlDoc.GetElementsByTagName("VertrekkendeTrein");
var element = ns[0] as XmlElement;
XmlNodeList nsvertrektijdje = element.GetElementsByTagName("RouteTekst");
var vty1 = nsvertrektijdje[0].InnerText;
MessageBox.Show(vty1);
问题在于,由于 ns[0].InnerXml 没有根节点,您无法解析内部 xml。
尝试在加载时附加临时节点 xml
xd1.LoadXml("<data>" + ns[0].InnerXml + "</data>");
我正在从安全网站加载 xml 页面,我想用 Xml 文档阅读该页面。
xml的一部分:
<ActueleVertrekTijden>
<VertrekkendeTrein>
<RitNummer>5070</RitNummer>
<VertrekTijd>2015-03-20T19:42:00+0100</VertrekTijd>
<EindBestemming>Den Haag Centraal</EindBestemming>
<TreinSoort>Sprinter</TreinSoort>
<RouteTekst>Lage Zwaluwe, Dordrecht, Rotterdam C.</RouteTekst>
<Vervoerder>NS</Vervoerder>
<VertrekSpoor wijziging="false">6</VertrekSpoor>
</VertrekkendeTrein>
<VertrekkendeTrein>
<RitNummer>1971</RitNummer>
<VertrekTijd>2015-03-20T19:50:00+0100</VertrekTijd>
<EindBestemming>Venlo</EindBestemming>
<TreinSoort>Intercity</TreinSoort>
<RouteTekst>Tilburg, Eindhoven, Helmond</RouteTekst>
<Vervoerder>NS</Vervoerder>
<VertrekSpoor wijziging="false">4</VertrekSpoor>
<Opmerkingen> // This is not always available, but it is important and specific for a 'VertrekkendeTrein'
<Opmerking>Rijdt vandaag niet</Opmerking>
</Opmerkingen>
</VertrekkendeTrein>
现在我使用以下代码:
string urlo = "the website";
string resultje = HttpGeto(urlo);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(resultje);
XmlNodeList ns = xmlDoc.GetElementsByTagName("VertrekkendeTrein");
//MessageBox.Show(ns[0].InnerXml); //*This part works it shows the xml inside the first "VertrekkendeTrein"*
//*Now I want to read all the items of ns[0] and split it like: GetElementsByTagName("RouteTekst")*
XmlDocument xd1 = new XmlDocument();
xd1.LoadXml(ns[0].InnerXml);
XmlNodeList nsvertrektijdje = xd1.GetElementsByTagName("RouteTekst");
var vty1 = nsvertrektijdje[0].InnerText;
MessageBox.Show(vty1);
我现在遇到的问题是我无法在 LoadXml 中加载 ns[0].InnerXml。没有结果。
编辑:
现在我使用的是:
string urlo = "website";
string resultje = HttpGeto(urlo);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(resultje);
XmlNodeList ns = xmlDoc.GetElementsByTagName("VertrekkendeTrein");
var element = ns[0] as XmlElement;
XmlNodeList nsvertrektijdje = element.GetElementsByTagName("RouteTekst");
var vty1 = nsvertrektijdje[0].InnerText;
MessageBox.Show(vty1);
但是还是不行
您不能使用 InnerXml
,因为它不包含 VertrekkendeTrein
节点,所以它不是有效的 xml 文档(一个文档只能有一个根节点)。您可以使用 OuterXml
,但这很浪费,因为您已经解析了 XML.
这里最好的方法是将 XmlNode
转换为 XmlElement
并从中使用 GetElementsByTagName
方法。
var element = ns[0] as XmlElement;
XmlNodeList nsvertrektijdje = element.GetElementsByTagName("RouteTekst");
完整代码现在如下所示:
var xml = @"<ActueleVertrekTijden>
<VertrekkendeTrein>
<RitNummer>5070</RitNummer>
<VertrekTijd>2015-03-20T19:42:00+0100</VertrekTijd>
<EindBestemming>Den Haag Centraal</EindBestemming>
<TreinSoort>Sprinter</TreinSoort>
<RouteTekst>Lage Zwaluwe, Dordrecht, Rotterdam C.</RouteTekst>
<Vervoerder>NS</Vervoerder>
<VertrekSpoor wijziging=""false"">6</VertrekSpoor>
</VertrekkendeTrein>
<VertrekkendeTrein>
<RitNummer> 1971 </RitNummer>
<VertrekTijd> 2015 - 03 - 20T19: 50:00 + 0100 </VertrekTijd >
<EindBestemming> Venlo </EindBestemming>
<TreinSoort> Intercity </TreinSoort>
<RouteTekst> Tilburg, Eindhoven, Helmond </RouteTekst>
<Vervoerder> NS </Vervoerder>
<VertrekSpoor wijziging = ""false""> 4 </VertrekSpoor>
<Opmerkingen> // This is not always available, but it is important and specific for a 'VertrekkendeTrein'
<Opmerking> Rijdt vandaag niet</Opmerking>
</Opmerkingen>
</VertrekkendeTrein></ActueleVertrekTijden>";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xml);
XmlNodeList ns = xmlDoc.GetElementsByTagName("VertrekkendeTrein");
var element = ns[0] as XmlElement;
XmlNodeList nsvertrektijdje = element.GetElementsByTagName("RouteTekst");
var vty1 = nsvertrektijdje[0].InnerText;
MessageBox.Show(vty1);
问题在于,由于 ns[0].InnerXml 没有根节点,您无法解析内部 xml。 尝试在加载时附加临时节点 xml
xd1.LoadXml("<data>" + ns[0].InnerXml + "</data>");