[英]xPath : XmlNode.SelectSingleNode() gets always same node
我一直在嘗試使這個查詢工作。 我有一個看起來像這樣的XML:
<Usuarios>
<Usuario>
<username>ghamilton</username>
<nombre>Catherine Hart</nombre>
<fechaNacimiento>12-03-1983 00:00:00</fechaNacimiento>
<nickname>ghamilton</nickname>
<EventosInscripto/>
<Amistades>
<amistad>
<username>dreed</username>
<nombre>Ruby Price</nombre>
<tipo>Aceptado</tipo>
<nickname>dreed</nickname>
<fechaNacimiento>23-12-1986 00:00:00</fechaNacimiento>
</amistad>
<amistad>
<username>ffernandez</username>
<nombre>Michael Rivera</nombre>
<tipo>Aceptado</tipo>
<nickname>ffernandez</nickname>
<fechaNacimiento>07-02-1997 00:00:00</fechaNacimiento>
</amistad>
</Amistades>
</Usuario>
<!-- a lot more 'Usuario' tags after this one -->
<Usuarios/>
我想做的是讓所有Usuarios的值都存儲在標簽'username','nombre','fechaNacimiento'和昵稱中。
為此,我有這個代碼:
XmlNodeList usuarios = xmlDoc.SelectNodes("/Usuarios/Usuario");
foreach (XmlNode usuario in usuarios)
{
//I would use this object to populate a treeview
rg = new Registrado(
xmlNode.SelectSingleNode(@"/username").InnerText,
"NA",
xmlNode.SelectSingleNode(@"/nombre").InnerText,
DateTime.ParseExact(xmlNode.SelectSingleNode(@"/fechaNacimiento").InnerText, "dd-MM-yyyy HH:mm:ss", null),
xmlNode.SelectSingleNode(@"/nickname").InnerText,
null,
null,
null,
null,
true
);
}
但是這個xPath總是選擇第一個'usuario'並且它是子節點並且不會循環它們。 實際上,它確實遍歷整個文檔,給出了匹配的確切數量,但總是返回相同的數據。
有關為什么我的XPath失敗的任何想法?
謝謝!
你應該在Registrado
函數中使用usuario
而不是xmlNode
,即
XmlNodeList usuarios = xmlDoc.SelectNodes("Usuarios/Usuario");
foreach (XmlNode usuario in usuarios)
{
var username = usuario.SelectSingleNode("username").InnerText;
var nombre = usuario.SelectSingleNode("nombre").InnerText;
var fechaNacimiento = usuario.SelectSingleNode("fechaNacimiento").InnerText
var nickName = usuario.SelectSingleNode("nickname").InnerText;
var datefechaNacimiento = DateTime.ParseExact(fechaNacimiento,
"dd-MM-yyyy HH:mm:ss", null);
rg = new Registrado(username, "NA",nombre, datefechaNacimiento,nickName,
null, null,null,null,true);
}
還有一個非常重要的注意事項,在處理選擇節點時始終確保進行空檢查,即不是直接訪問節點innerText,而是首先確保它們不為空即
if(usuario.SelectSingleNode("username")!=null)
{
strUsername = usuario.SelectSingleNode("username").InnerText;
}
另外,雖然XmlDocument
類非常強大和有用,但也要看Linq-to-XML
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.