Vinnaren i pepparkakshustävlingen!
2016-09-26, 10:21
  #1
Medlem
Hej!

Jag håller på att bygga en adressbok med C#, men lyckas inte söka på en person som finns lagrad i xml filen. Är det någon som kan hjälpa mig med att hitta felet i min kod?

Felmeddelandet jag får:

An unhandled exception of type 'System.NullReferenceException' occurred in Inlamning1.exe

Additional information: Objektreferensen har inte angetts till en instans av ett objekt.

Kod:
private void buttonSearch_Click(object sender, EventArgs e)
{
string path = @C:\Users\A\Documents\Visual Studio 2015\Projects\Inlamning1\Inlamning1;
XmlDocument doc = new XmlDocument();
doc.Load(path + "\\AdressBook\\settings.xml");
XmlElement elmRoot = doc.DocumentElement;
var id = TxtBoxSearch.Text;
string xPath = "//Person[@Name='" + id + "']";
XmlNode findnode = elmRoot.SelectSingleNode(xPath);

foreach (XmlElement node in findnode)
{
MessageBox.Show(node.InnerText);
}
}
Citera
2016-09-26, 10:28
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av Ice7
Hej!

Jag håller på att bygga en adressbok med C#, men lyckas inte söka på en person som finns lagrad i xml filen. Är det någon som kan hjälpa mig med att hitta felet i min kod?

Felmeddelandet jag får:

An unhandled exception of type 'System.NullReferenceException' occurred in Inlamning1.exe

Additional information: Objektreferensen har inte angetts till en instans av ett objekt.

Kod:
private void buttonSearch_Click(object sender, EventArgs e)
{
string path = @C:\Users\A\Documents\Visual Studio 2015\Projects\Inlamning1\Inlamning1;
XmlDocument doc = new XmlDocument();
doc.Load(path + "\\AdressBook\\settings.xml");
XmlElement elmRoot = doc.DocumentElement;
var id = TxtBoxSearch.Text;
string xPath = "//Person[@Name='" + id + "']";
XmlNode findnode = elmRoot.SelectSingleNode(xPath);

foreach (XmlElement node in findnode)
{
MessageBox.Show(node.InnerText);
}
}
Det står ju vad som är fel, nånstans i din kod får du tag på ett objekt som är NULL, men som du ändå försöker använda som om det vore ett korrekt initierat objekt.

Troligen ligger inte felet i din kod direkt, utan mer troligt är att do har otillräcklig validering på indatan från din fil.

Enklaste sättet att hitta felet är att använda debuggern i visual studio, alternativt sätta en massa iffar och utskrifter där det kan tänkas bli en nullreference, förslagsvis vid de tillfällen du vill göra operationer på ditt xml-document du laddat upp.

Lämpliga kandidater är ju din referens findNode, hittas den verkligen, är du säker på att den inte är null?
Kod:
if(findNode != null)
//do stuff 
Är node en giltig referens? är propertyn innerText en gitlig property på detta objekt?

Undersöks enklast utan debugger med iffar på strategiska ställen.
__________________
Senast redigerad av Proton 2016-09-26 kl. 10:31.
Citera
2016-09-26, 13:05
  #3
Medlem
MeanMEs avatar
Finns ett exempel här som gör ungefär det du frågar efter:

http://stackoverflow.com/questions/6...o-xml-document

Kod:
<Names>
    <Name>
        <FirstName>John</FirstName>
        <LastName>Smith</LastName>
    </Name>
    <Name>
        <FirstName>James</FirstName>
        <LastName>White</LastName>
    </Name>
</Names>

Kod:
XmlDocument xml = new XmlDocument();
xml.LoadXml(myXmlString); // suppose that myXmlString contains "<Names>...</Names>"

XmlNodeList xnList = xml.SelectNodes("/Names/Name");
foreach (XmlNode xn in xnList)
{
    string firstName = xn["FirstName"].InnerText;
    string lastName = xn["LastName"].InnerText;
    Console.WriteLine("Name: {0} {1}", firstName, lastName);
}

Sedan, blanda inte olika file path syntaxer.
Använder du @"" så gör det konsekvent, att från gång till annan köra \\ ser inte bra ut.

Så byt ut:
doc.Load(path + "\\AdressBook\\settings.xml");

till:
doc.Load(path + @"\AdressBook\settings.xml");
__________________
Senast redigerad av MeanME 2016-09-26 kl. 13:09.
Citera
2016-09-26, 15:50
  #4
Medlem
MeanMEs avatar
Testade skriva funktionen och den verkar funka bra.
Ta det för vad det är, har inte skrivit en rad kod map xml innan...

Kod:
private void button1_Click(object sender, EventArgs e)
{
    XmlDocument doc = new XmlDocument();
    string path = @"C:\Users\MeanME\Documents\Projects\CSharp\NameFile.xml";
    doc.Load(path);
    string id = textBox1.Text;
          
    foreach (XmlElement node in doc.DocumentElement) // Här det vart fel för dig.
    {
        if(String.Equals(node.InnerText.ToString(), id.ToString()))
        MessageBox.Show(node.InnerText);
    }
}

Kod:
<?xml version="1.0" encoding="utf-8" ?> 

<Names>
    <Name>
        <FirstName>Anders</FirstName>
        <LastName> Andersson</LastName>
    </Name>
    <Name>
        <FirstName>Leif</FirstName>
        <LastName> Pettersson</LastName>
    </Name>
    <Name>
        <FirstName>Sven</FirstName>
        <LastName> Lindström</LastName>
    </Name>
    <Name>
        <FirstName>Leif</FirstName>
        <LastName> Björk</LastName>
    </Name>
</Names>

Edit: Tog bort inaktiv kod.
__________________
Senast redigerad av MeanME 2016-09-26 kl. 16:05. Anledning: Tog bort inaktiv kod.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback