簡體   English   中英

xPath:XmlNode.SelectSingleNode()始終是相同的節點

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM