Ik zit met het volgende probleem:
Ik krijg van een webservice (via SOAP) een XML+XSD aangeleverd die ik in een dataset gooi en die aan een datagrid knoop, dit werkt allemaal prima.
Nu wil ik een (of meerdere) row(s) uit de datagrid terugsturen (via SOAP) naar de webservice. Dit doe ik dmv de volgende code:
Dit werkt goed zolang ik alle velden in de row invoer.
Maar op het moment dat er 1 of meerdere velden leeg zijn, krijg ik een SOAP exception dat hij een veld mist.
Het probleem zit hem in .GetXML(): als die een NULL value tegenkomt in de dataset laat hij het hele element weg.
Ik krijg als output dan:
Terwijl SOAP het volgende vereist:
Ik heb flink gegoogled en er zijn heel veel mensen met hetzelfde probleem, maar er is geen fatsoenlijke oplossing in mijn geval. Ze gaan er allemaal vanuit dat je weet welke kolommen er in de dataset zitten. Dat weet ik niet, de dataset wordt opgebouwd aan de hand van de XSD data die ik van mijn webservice krijg.
Ik kan de input van de dataset niet bepalen, die krijg ik van de webservice, die levert lege elementen aan die vervolgens als NULL in de dataset terecht komen.
GetXML() kan geen lege elementen uitpoepen, hij laat ze altijd weg.
Ik zit met een paar mogelijke oplossingen:
* Zelf een dataset naar XML parser schrijven, die null values wél als leeg element toevoegt aan mijn XML. (tijdrovend, lastig en waarschijnlijk overbodig)
* Een manier vinden om via bestaande functies mijn XML goed outgeput te krijgen. Ik las iets over de WriteXML() functie die aan de hand van een XSD XML output, maar die krijg ik ook niet zo ver dat hij lege elementen aanmaakt...
* Zorgen dat de dataset geen NULL values kan bevatten, wat lastig is omdat ik vantevoren niet weet welke datatypes er in de dataset/datagrid komen.
Wat zie ik over het hoofd, het moet toch mogelijk zijn om lege elementen in mijn XML te krijgen adhv een dataset?
Mijn XSD (voor een voorbeeld tabel):
Ik krijg van een webservice (via SOAP) een XML+XSD aangeleverd die ik in een dataset gooi en die aan een datagrid knoop, dit werkt allemaal prima.
Nu wil ik een (of meerdere) row(s) uit de datagrid terugsturen (via SOAP) naar de webservice. Dit doe ik dmv de volgende code:
C#:
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
26
27
28
29
30
31
32
33
34
| DataSet changedDsRows = new DataSet(); XmlDocument schemaDoc = new XmlDocument(); XmlDocument dataDoc = new XmlDocument(); XmlDocument dataSetDoc = new XmlDocument(); XmlElement root; XmlNode schemaNode; XmlNode dataNode; changedDsRows = ds.GetChanges(); if (changedDsRows != null) { schemaDoc.Load(new StringReader(changedDsRows.GetXmlSchema())); dataDoc.Load(new StringReader(changedDsRows.GetXml())); dataSetDoc.LoadXml("<DataSet></DataSet>"); root = dataSetDoc.DocumentElement; root.SetAttribute("xmlns", ""); schemaNode = dataSetDoc.ImportNode(schemaDoc.DocumentElement, true); dataNode = dataSetDoc.ImportNode(dataDoc.DocumentElement, true); root.AppendChild(schemaNode); root.AppendChild(dataNode); objTable = dataSetDoc.DocumentElement; try { svc_admin.insertrow(tabel, objTable); } catch (SoapException f) { lbl_status.Text = f.Message.ToString() + ": " + f.Detail.InnerText.ToString(); } ds.AcceptChanges(); } |
Dit werkt goed zolang ik alle velden in de row invoer.
Maar op het moment dat er 1 of meerdere velden leeg zijn, krijg ik een SOAP exception dat hij een veld mist.
Het probleem zit hem in .GetXML(): als die een NULL value tegenkomt in de dataset laat hij het hele element weg.
Ik krijg als output dan:
XML:
1
2
3
4
5
6
| <Data> <Item> <UserCd>test</UserCd> <UserName>Test User</UserName> </Item> </Data> |
Terwijl SOAP het volgende vereist:
XML:
1
2
3
4
5
6
7
8
| <Data> <Item> <UserCd>test</UserCd> <UserName>Test User</UserName> <UserPrinter/> <rowid/> </Item> </Data> |
Ik heb flink gegoogled en er zijn heel veel mensen met hetzelfde probleem, maar er is geen fatsoenlijke oplossing in mijn geval. Ze gaan er allemaal vanuit dat je weet welke kolommen er in de dataset zitten. Dat weet ik niet, de dataset wordt opgebouwd aan de hand van de XSD data die ik van mijn webservice krijg.
Ik kan de input van de dataset niet bepalen, die krijg ik van de webservice, die levert lege elementen aan die vervolgens als NULL in de dataset terecht komen.
GetXML() kan geen lege elementen uitpoepen, hij laat ze altijd weg.
Ik zit met een paar mogelijke oplossingen:
* Zelf een dataset naar XML parser schrijven, die null values wél als leeg element toevoegt aan mijn XML. (tijdrovend, lastig en waarschijnlijk overbodig)
* Een manier vinden om via bestaande functies mijn XML goed outgeput te krijgen. Ik las iets over de WriteXML() functie die aan de hand van een XSD XML output, maar die krijg ik ook niet zo ver dat hij lege elementen aanmaakt...
* Zorgen dat de dataset geen NULL values kan bevatten, wat lastig is omdat ik vantevoren niet weet welke datatypes er in de dataset/datagrid komen.
Wat zie ik over het hoofd, het moet toch mogelijk zijn om lege elementen in mijn XML te krijgen adhv een dataset?
Mijn XSD (voor een voorbeeld tabel):
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| <xs:schema id="Data" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="Data" msdata:IsDataSet="true" msdata:Locale="en-US"> <xs:complexType> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="Item"> <xs:complexType> <xs:sequence> <xs:element name="UserCd" type="xs:string" minOccurs="0" /> <xs:element name="UserName" type="xs:string" minOccurs="0" /> <xs:element name="UserPrinter" type="xs:string" minOccurs="0" /> <xs:element name="rowid" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> |
tyrips, tywreps, tiewreps, tiereps, tie raps, ripties, taiwraps, kabelbindbandjes » Tie Wraps
\o/