Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#/XML] Opvragen van elementen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb volgende xml-code :
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<BusinessEntity xsi:type="DynamicEntity" Name="account" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/crm/2006/WebServices">
  <Properties>
    <Property xsi:type="StringProperty" Name="name">
      <Value>tesetetsetset</Value>
    </Property>
    <Property xsi:type="PicklistProperty" Name="new_taal">
      <Value>1</Value>
    </Property>
    <Property xsi:type="StringProperty" Name="new_vat">
      <Value>NIHIL</Value>
    </Property>
    <Property xsi:type="OwnerProperty" Name="ownerid">
      <Value type="systemuser">{76B4524B-49DC-DB11-91C6-0019BB3863DC}</Value>
    </Property>
    <Property xsi:type="StringProperty" Name="address1_city">
      <Value>test</Value>
    </Property>
    <Property xsi:type="StringProperty" Name="address1_postalcode">
      <Value>88741</Value>
    </Property>
    <Property xsi:type="PicklistProperty" Name="new_land">
      <Value>1</Value>
    </Property>
  </Properties>
</BusinessEntity>


Het volgende om proberen element "new_vat" uit de xml te halen :
C#:
1
2
3
4
5
6
7
XmlDocument xd = new XmlDocument();
xd.LoadXml(entityXml);
xd.GetElementsByTageName("Property"))
{
    Log(entityXml); //getting the xml output (de bovenstaande xml wordt effectief gemaakt)
    MessageBox.show(element.attributes.GetNamedItem("new_vat").Value);
}


Ik krijg een error in mijn catch -->
Xml Error : System.NullReferenceException: Object reference not set to an instance of an object.

Wat doe ik verkeerd ?

[ Voor 5% gewijzigd door RobIII op 22-10-2007 09:39 . Reden: Code tags toegevoegd ]


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
System.NullReferenceException is toch redelijk duidelijk wat er mis gaat?

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 17-10 16:43
je gebruikt xml.load, maar moet je niet een streamreader/xmlreader aanmaken?

ik dacht dat als je using System.XML deed (weet de exacte namespace niet meer) dat je dan een XML reader kreeg)

ik geloof dat hier meer staat:
http://www.codeproject.com/soap/XMLReadWrite.asp

~ Mijn prog blog!


Verwijderd

Topicstarter
therat10430 schreef op donderdag 18 oktober 2007 @ 08:37:
je gebruikt xml.load, maar moet je niet een streamreader/xmlreader aanmaken?

ik dacht dat als je using System.XML deed (weet de exacte namespace niet meer) dat je dan een XML reader kreeg)

ik geloof dat hier meer staat:
http://www.codeproject.com/soap/XMLReadWrite.asp
Het is in C#.NET 1.1... In samenwerking met CRM...

@4of9 :
Dat weet ik ook wel, maar wat doe ik dan verkeerd om die error te krijgen.. Want ik heb effectief een werkende XML-file. Zoals je ka nzien staat new_vat er weldegelijk in met als value Nihil .. Dus zou hij toch moeten in de messagebox -> "Nihil" weergeven..

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Waarom gebruik je niet gewoon xpath? //property[@Name='new_vat']/Value icm met xml.SelectSingleNode? Veel eenvoudiger (zeker als je weet wat je wilt hebben). krijg je 'null' terug dan is het element niet aanwezig en anders krijg je een XmlNode terug.

Maar wat wil je wat we met die code doen? Voorbeeld code is foutief (dubbele ')' achter GetElements... en element wordt nooit gespecificeerd. Als je wilt dat mensen je helpen, zet dan in elk geval relevante code neer een geen pseudo code. Daarnaast geeft je ook niet aan op welke regel je de foutmelding krijgt. GetElementsBijTagName() retourneert een XmlNodeList. Het eerst item zal geen attribute 'new_vat' kennen (geeft null terug) en kun je dus ook de waarde daarvan niet opvragen.

Dus of ga eerst maar eens wat Microsoft XML documentatie lezen, of post de daadwerkelijke code welke het probleem geeft. Een andere optie is om een consultant in te huren om het voor je op te lossen.

If it isn't broken, fix it until it is..


Verwijderd

Topicstarter
Niemand_Anders schreef op donderdag 18 oktober 2007 @ 08:53:
Waarom gebruik je niet gewoon xpath? //property[@Name='new_vat']/Value icm met xml.SelectSingleNode? Veel eenvoudiger (zeker als je weet wat je wilt hebben). krijg je 'null' terug dan is het element niet aanwezig en anders krijg je een XmlNode terug.

Maar wat wil je wat we met die code doen? Voorbeeld code is foutief (dubbele ')' achter GetElements... en element wordt nooit gespecificeerd. Als je wilt dat mensen je helpen, zet dan in elk geval relevante code neer een geen pseudo code. Daarnaast geeft je ook niet aan op welke regel je de foutmelding krijgt. GetElementsBijTagName() retourneert een XmlNodeList. Het eerst item zal geen attribute 'new_vat' kennen (geeft null terug) en kun je dus ook de waarde daarvan niet opvragen.

Dus of ga eerst maar eens wat Microsoft XML documentatie lezen, of post de daadwerkelijke code welke het probleem geeft. Een andere optie is om een consultant in te huren om het voor je op te lossen.
Zoals ik al in me vorige post zei werk ik in 1.1 en krijg ik effectief geen output op scherm. Ik krijg output in een logfile .. Die messagebox.show moest normaal Log zijn, maar ik had het eventjes getest in gewoon 2.0.

Maar de code (waar hij naar catch springt) gebeurt effectief bij "element.attributes.GetNamedItem("new_vat").Value" .. Dit is code die werd meegegeven bij de "PreCreate" postcallout voor Microsoft CRM 3.0. Ikzelf werk zelden met xml waardoor dit voor mij allemaal nieuw is :)

Dus mijn excuses als de code er totaal ni goed uitzie .. Maar ik werk met de .dll gekoppeld aan CRM en met webreferences enz...

  • whoami
  • Registratie: December 2000
  • Nu online
Wat je verkeerd doet: je schrijft ergens naar niet-gealloceerd geheugen. Maw, één van je variabelen bevat NULL, en je wil iets met die variabele doen.

Wat moet je nu doen ? Debuggen. Stap voor stap eens door de code lopen, en kijken welke variabele NULL is die niet NULL zou moeten zijn, en de boel aanpassen.
In joug geval zal hij de method GetNamedItem("new_vat") waarschijnljk NULL returnen; als in, er wordt geen item 'new_vat' gevonden.

Dit is dus gewoon een beetje basis-kennis debuggen. :)

https://fgheysels.github.io/


Verwijderd

Als je het jezelf wat makkelijker wilt maken dan gebruik je het XML schema wat bij de XML hoort. Dat heb je natuurlijk toch?

Je kan dan xsd.exe gebruiken om een klasse te genereren op basis van het schema en vervolgens de XMLDeserializer gebruiken om de xml in te lezen. Ben je van al dat parsen van XML af. :)

  • Ashtaroth
  • Registratie: December 2003
  • Laatst online: 25-09-2019
Ik kan niet zien of de variabele 'element' wordt gedeclareerd.
Daarnaast wordt van de attribuut 'new_vat' de waarde opgevraagd, terwijl dat attribuut niet bestaat.

Wat je wilt is de waarde ophalen van het element Value die child is van het element Property, waarvan het attribuut Name de waarde 'new_vat' is.
Dan krijg je idd de xpath query van Niemand_Anders: SelectSingleNode("Property[@Name='new_vat']/Value").Value.

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Direct '.Value' achter SelectSingleNode plakken is erg gevaarlijk. Als het item niet bestaat, krijg je alsnog een null-reference exception. Het resultaat van SelectSingleNode moet altijd op null worden gecontroleert voordat je verder gaat, maar dat geld eigenlijk voor elke statement welke een resultaat moet terug geven.

If it isn't broken, fix it until it is..


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 19:45

TeeDee

CQB 241

Ik mag trouwens ook hopen dat
C#:
1
GetElementsByTageName
een tikfout is.
RobIII schreef op maandag 22 oktober 2007 @ 09:42:
[...]
offtopic:
Tenzij je Montag, Dienstag, Mittwoch, Donnerstag, ...etc tags hebt ;) :+
offtopic:
Thanks, die had ik nodig om vandaag op gang te komen :+ Mijn god, die's flauw :D

[ Voor 64% gewijzigd door TeeDee op 22-10-2007 10:00 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
TeeDee schreef op maandag 22 oktober 2007 @ 09:37:
Ik mag trouwens ook hopen dat
C#:
1
GetElementsByTageName
een tikfout is.
offtopic:
Tenzij je Montag, Dienstag, Mittwoch, Donnerstag, ...etc tags hebt ;) :+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1