web-dev-qa-db-fra.com

Comment obtenir la valeur du noeud XML dans une chaîne

J'ai essayé le code ci-dessous pour obtenir la valeur d'un nœud particulier, mais lors du chargement du XML, cette exception est levée:

Exception:

Les données au niveau racine ne sont pas valides. Ligne 1, position 1.

XML

<?xml version="1.0"?>
<Data xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Date>11-07-2013</Date> 
    <Start_Time>PM 01:37:11</Start_Time> 
    <End_Time>PM 01:37:14</End_Time> 
    <Total_Time>00:00:03</Total_Time> 
    <Interval_Time/>
    <Worked_Time>00:00:03</Worked_Time> 
    <Short_Fall>08:29:57</Short_Fall> 
    <Gain_Time>00:00:00</Gain_Time> 
</Data>

C #:

XmlDocument xml = new XmlDocument();
filePath = @"D:\Work_Time_Calculator\10-07-2013.xml";
xml.LoadXml(filePath);  // Exception occurs here 
XmlNode node = xml.SelectSingleNode("/Data[@*]/Short_Fall");
string id = node["Short_Fall"].InnerText;

Code modifié

C #:

XmlDocument xml = new XmlDocument();
filePath = @"D:\Work_Time_Calculator\10-07-2013.xml";
xml.Load(filePath);  
XmlNode node = xml.SelectSingleNode("/Data[@*]/Short_Fall");
string id = node["Short_Fall"].InnerText; // Exception occurs here ("Object reference not set to an instance of an object.")
16
Vignesh

Le problème dans votre code est xml.LoadXml(filePath);

La méthode LoadXml prend le paramètre sous données xml pas le chemin du fichier xml

Essayez ce code

   string xmlFile = File.ReadAllText(@"D:\Work_Time_Calculator\10-07-2013.xml");
                XmlDocument xmldoc = new XmlDocument();
                xmldoc.LoadXml(xmlFile);
                XmlNodeList nodeList = xmldoc.GetElementsByTagName("Short_Fall");
                string Short_Fall=string.Empty;
                foreach (XmlNode node in nodeList)
                {
                    Short_Fall = node.InnerText;
                }

Modifier

En voyant la dernière modification de votre question, j'ai trouvé la solution,

Il suffit de remplacer les 2 lignes ci-dessous 

XmlNode node = xml.SelectSingleNode("/Data[@*]/Short_Fall");
string id = node["Short_Fall"].InnerText; // Exception occurs here ("Object reference not set to an instance of an object.")

avec 

string id = xml.SelectSingleNode("Data/Short_Fall").InnerText;

Cela devrait résoudre votre problème ou vous pouvez utiliser la solution fournie précédemment. 

23
Rezoan

Vous devriez utiliser .Load et non .LoadXML

MSDN Link

"La méthode LoadXml permet de charger directement une chaîne XML. Vous souhaitez plutôt utiliser la méthode Load."

ref: Link

8
Siraj Mansour
XmlDocument d = new XmlDocument();
d.Load(@"D:\Work_Time_Calculator\10-07-2013.xml");
XmlNodeList n = d.GetElementsByTagName("Short_Fall");
if(n != null) {
    Console.WriteLine(n[0].InnerText); //Will output '08:29:57'
}

or you could wrap in foreach loop to print each value

XmlDocument d = new XmlDocument();
d.Load(@"D:\Work_Time_Calculator\10-07-2013.xml");
XmlNodeList n = d.GetElementsByTagName("Short_Fall");
if(n != null) {
    foreach(XmlNode curr in n) {
        Console.WriteLine(curr.InnerText);
    }
}
0
ravula sandeep