Convert XML Dom Structure while deserialization - c#

I have to transform the XML DOM structure into another XML DOM structure, How can I perform it using custom serialization implemented via IXmlSerialization. The source and target XML structure are mentioned as below
Source XML
<?xml version="1.0"?>
<ConfigFileRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DeviceConnectionParams>
<DeviceConnectionParam>
<UserId>administrator</UserId>
<Password>B670AAB84F449BF3953C5ABE947DEF0C</Password>
<IsManual>True</IsManual>
</DeviceConnectionParam>
</DeviceConnectionParams>
<AlarmMappings>
<Enabled>true</Enabled>
<AlarmA>
<Events>
<EventId>
<PanelId>1</PanelId>
<PanelName>TestAccess</PanelName>
<DeviceId>65</DeviceId>
<DeviceName>TestPanel</DeviceName>
</EventId>
<EventId>
<PanelId>1</PanelId>
<PanelName>TestAccess</PanelName>
<DeviceId>65</DeviceId>
<DeviceName>TestPanel</DeviceName>
</EventId>
</Events>
</AlarmA>
<AlarmB>
<AlarmId>0a103f2b3ce7498c4fcaafb965c742cca66a221027054490eab5459689303bbea1f81898380c</AlarmId>
<NvrUuid>0a1027054490eab5459689303bbea1f818983801</NvrUuid>
</AlarmB>
</AlarmMappings>
</ConfigFileRoot>
Target XML
<?xml version="1.0"?>
<ConfigFileRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<DeviceConnectionParams>
<DeviceConnectionParam>
<UserId>administrator</UserId>
<Password>B670AAB84F449BF3953C5ABE947DEF0C</Password>
<IsManual>True</IsManual>
</DeviceConnectionParam>
</DeviceConnectionParams>
<AlarmMappings>
<Enabled>true</Enabled>
<AlarmA>
<Events>
<EventId>
<PanelId>1</PanelId>
<PanelName>TestAccess</PanelName>
<DeviceId>65</DeviceId>
<DeviceName>TestPanel</DeviceName>
</EventId>
</Events>
</AlarmA>
<AlarmB> <AlarmId>0a103f2b3ce7498c4fcaafb965c742cca66a221027054490eab5459689303bbea1f81898380c</AlarmId>
<NvrUuid>0a1027054490eab5459689303bbea1f818983801</NvrUuid>
</AlarmB>
</AlarmMappings>
<AlarmMappings>
<Enabled>true</Enabled>
<AlarmA>
<Events>
<EventId>
<PanelId>1</PanelId>
<PanelName>TestAccess</PanelName>
<DeviceId>65</DeviceId>
<DeviceName>TestPanel</DeviceName>
</EventId>
</Events>
</AlarmA>
<AlarmB>
<AlarmId>0a103f2b3ce7498c4fcaafb965c742cca66a221027054490eab5459689303bbea1f81898380c</AlarmId>
<NvrUuid>0a1027054490eab5459689303bbea1f818983801</NvrUuid>
</AlarmB>
</AlarmMappings>
</ConfigFileRoot>

Related

Removing Attribute value based on value from an XML using VB.Net

I have an XML as below
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns="http://com/uhg/uht/uhtSoapMsg_V1"
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
<env:Header>
<uhtHeader
xmlns="http://com/uhg/uht/uhtHeader_V1">
<consumer>COMET</consumer>
<auditId></auditId>
<sendTimestamp>2020-09-03T18:15:40.942-05:00</sendTimestamp>
<environment>P</environment>
<businessService version="24">getClaimHistory</businessService>
<status>success</status>
</uhtHeader>
</env:Header>
<env:Body>
<srvcRspn
xmlns="http://com/uhg/uht/getClaimHistory_V24">
<srvcErrList arrayType="srvcErrOccur[1]" type="Array">
<srvcErrOccur>
<orig>Foundation</orig>
<rtnCd>00</rtnCd>
<explCd>000</explCd>
<desc></desc>
</srvcErrOccur>
</SrvcErrList>
</srvcRspn>
</env:Body>
</env:Envelope>
I want to remove all the attribute values with "http" like below:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope
xmlns=""
xmlns:env="">
<env:Header>
<uhtHeader
xmlns="">
<consumer>COMET</consumer>
<auditId></auditId>
<sendTimestamp>2020-09-03T18:15:40.942-05:00</sendTimestamp>
<environment>P</environment>
<businessService version="24">getClaimHistory</businessService>
<status>success</status>
</uhtHeader>
</env:Header>
<env:Body>
<srvcRspn
xmlns="">
<srvcErrList arrayType="srvcErrOccur[1]" type="Array">
<srvcErrOccur>
<orig>Foundation</orig>
<rtnCd>00</rtnCd>
<explCd>000</explCd>
<desc></desc>
</srvcErrOccur>
</SrvcErrList>
</srvcRspn>
</env:Body>
</env:Envelope>
I have tried several ways but none of them has worked for me. Can anyone suggest what is fastest way to do it in VB.NET/C#.
The actual response is very large (approx 100000 lines of XML minimum) and using for each will consume a good amount of time. Is there any parsing method or LINQ query method which can do it faster.
I got the way to do it using Regex as below:
Return Regex.Replace(xmlDoc, "((?<=<|<\/)|(?<= ))[A-Za-z0-9]+:| xmlns(:[A-Za-z0-9]+)?="".*?""", "")
It serves my purpose completely. Thanks Cleptus for your quick reference.

VS Generated WSDL Namespace Issues

Good Afternoon,
We have been trying to consume a Carrier API, but have hit some issue with the WSDL Generation. The Example XML message the company has provided has ns1-3 and appears that it is important for the address fields. the XML generated from their WSDL seems to generate the same fields but has no name spaces like the original and fails with "Address details are invalid", Is there some setting we are missing so that it generates the correct XML?
This is their Example XML
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns3:CreateLabel xmlns:ns3="http://courier.ck.dx.metafour.com/" xmlns:ns2="http://www.thedx.co.uk/eai/canonical/types/v2.0">
<order>
<ns2:customerID>14337622</ns2:customerID>
<ns2:dates>
<date format="yyyy-MM-dd HH:mm:ss" type="requestedCollectionDate">2018-12-12 17:59:21</date>
</ns2:dates>
<sourceSystemReference xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0">AMS207554</sourceSystemReference>
<customerReference xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0">286956</customerReference>
<orderAttributes xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0" xsi:nil="true" />
<ns2:orderLines>
<ns2:consignment>
<pieces>
<dimensions>
<value>1.0</value>
<type>cdlWeight</type>
<UOM>KG</UOM>
</dimensions>
<barcode xsi:nil="true" />
<trackingNumber xsi:nil="true" />
</pieces>
<qty>1</qty>
<legacyService>
<name>serviceLevel</name>
<partyId>0</partyId>
<partyType>HITS</partyType>
</legacyService>
<legacyService>
<name>serviceType</name>
<partyId>2</partyId>
<partyType>HITS</partyType>
</legacyService>
<deliverTo>
<ns2:address primary="true">
<organisationName>Argos</organisationName>
<addressLine1>Argos</addressLine1>
<addressLine2>Argos Ltd</addressLine2>
<addressLine3>11 Canning Street</addressLine3>
<city>BURNLEY</city>
<postalCode>BB12 0AD</postalCode>
<country>
<countryCode>GB</countryCode>
<description>GB</description>
</country>
</ns2:address>
<contact />
</deliverTo>
</ns2:consignment>
</ns2:orderLines>
<labelType>ZPL</labelType>
</order>
<serviceHeader>
<password>test</password>
<userId>test</userId>
</serviceHeader>
</ns3:CreateLabel>
</s:Body>
</s:Envelope>
This is our Generated XML
<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CreateLabel xmlns="http://courier.ck.dx.metafour.com/">
<order xmlns="">
<customerID xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0">14337622</customerID>
<dates xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0">
<date xmlns="" format="yyyy-MM-dd HH:mm:ss" type="requestedCollectionDate">2019-01-25 10:17:33</date>
</dates>
<sourceSystemReference xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0">AMS207554</sourceSystemReference>
<customerReference xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0">286956</customerReference>
<orderAttributes xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0" xsi:nil="true" />
<orderLines xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0">
<consignment>
<pieces xmlns="">
<dimensions>
<value>1.0</value>
<type>cdlWeight</type>
<UOM>KG</UOM>
</dimensions>
<barcode xsi:nil="true" />
<trackingNumber xsi:nil="true" />
</pieces>
<qty>1</qty>
<legacyService xmlns="">
<name>serviceLevel</name>
<partyId>0</partyId>
<partyType>HITS</partyType>
</legacyService>
<legacyService xmlns="">
<name>serviceType</name>
<partyId>2</partyId>
<partyType>HITS</partyType>
</legacyService>
<deliverTo xmlns="">
<address xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0">
<organisationName xmlns="">Argos</organisationName>
<addressLine1 xmlns="">Argos</addressLine1>
<addressLine2 xmlns="">Argos Ltd</addressLine2>
<addressLine3 xmlns="">11 Canning Street</addressLine3>
<city xmlns="">BURNLEY</city>
<postalCode xmlns="">BB12 0AD</postalCode>
<country xmlns="">
<countryCode>GB</countryCode>
<description>GB</description>
</country>
</address>
<contact xmlns="http://www.thedx.co.uk/eai/canonical/types/v2.0" />
</deliverTo>
</consignment>
</orderLines>
<labelType>ZPL</labelType>
</order>
<serviceHeader xmlns="">
<password>test</password>
<userId>test</userId>
</serviceHeader>
</CreateLabel>
</s:Body>
</s:Envelope>
Any help would be greatly appreciated!
This is resolved,
I could not figure out a way to change or add additional namespace to the generated references.cs file, and ended up sending the SOAP to their server manually with an XML string serialized using a httpWebRequest and XmlSerializer

Remove the response wrapper from web service response?

Is it possible to remove the what appears to be automatic notificationRequestResponse node from the response?
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
...
<soap:Body>
<notificationRequestResponse xmlns="...">
<notificationResponse xmlns="...">
<success xmlns="">boolean</success>
<fault xmlns="">
...
</fault>
</notificationResponse>
</notificationRequestResponse>
</soap:Body>
</soap:Envelope>
I need to return the below:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
...
<soap:Body>
<notificationResponse xmlns="...">
<success xmlns="">boolean</success>
<fault xmlns="">
...
</fault>
</notificationResponse>
</soap:Body>
</soap:Envelope>
I want the notificationResponse to be the root of the response!
The WebMethod currently has no logic but:
return new notificationResponse()
Where is the notificationRequestResponse coming from? I can rename it using WebMethod SoapDocumentMethod(ResponseElementName="new name") but I want it gone. Working to a provided spec and have no choice.
Appreciated.
Found the answer...
SoapDocumentMethod(ParameterStyle = SoapParameterStyle.Bare)

How to create SOAP XML request message for paypal CreateInvoice api using c#

I have created a sandbox test accounts for PayPal.
I want to consume the PayPal api CreateInvoice,SendInvoice and CreateAndSendInvoice using SOAP xml format in C#. The documentation from x.com, doesn't show any completed request message at least in basic soap xml format, instead, it shows only the header part and definitions for soap xml tags.
Some examples are in JSON format but its not my preferred format,its light-weight but human readable. SDK's are using NVP format, although they have SOAP option but the codes are not able to compose the soap xml format for the payload.
I need the completed soap xml request message with at least the required fields to createinvoice.
I'm still searching stackoverflow so far.
The API reference provides a graphical representation of the SOAP request. For example, you can take a look at CreateAndSendInvoice and see all of the tags that could be included in your XML/SOAP request as well as how everything should be nested.
If you're going to be building the XML yourself as oppose to using a WSDL there's really no need to format it for SOAP. Here's a sample of an XML Request for CreateInvoice that I just ran successfully...
<?xml version="1.0" encoding="utf-8"?>
<CreateInvoiceRequest xmlns="http://svcs.paypal.com/types/ap">
<requestEnvelope xmlns="">
<detailLevel>ReturnAll</detailLevel>
<errorLanguage>en_US</errorLanguage>
</requestEnvelope>
<invoice xmlns="">
<merchantEmail xmlns="">sandbo_1215254764_biz#angelleye.com</merchantEmail>
<payerEmail xmlns="">sandbo_1204199080_biz#angelleye.com</payerEmail>
<number xmlns="">12Z3-ABCDE</number>
<merchantInfo xmlns="">
<firstName xmlns="">Tester</firstName>
<lastName xmlns="">Testerson</lastName>
<businessName xmlns="">Testers, LLC</businessName>
<phone xmlns="">555-555-5555</phone>
<fax xmlns="">555-555-5556</fax>
<website xmlns="">http://www.domain.com</website>
<customValue xmlns="">Some custom info.</customValue>
<address xmlns="">
<line1 xmlns="">123 Main St.</line1>
<city xmlns="">Grandview</city>
<state xmlns="">MO</state>
<postalCode xmlns="">64030</postalCode>
<countryCode xmlns="">US</countryCode>
</address>
</merchantInfo>
<itemList xmlns=""><item xmlns="">
<name xmlns="">Test Widget 1</name>
<description xmlns="">This is a test widget #1</description>
<date xmlns="">2012-02-18</date>
<quantity xmlns="">1</quantity>
<unitPrice xmlns="">10.00</unitPrice>
</item><item xmlns="">
<name xmlns="">Test Widget 2</name>
<description xmlns="">This is a test widget #2</description>
<date xmlns="">2012-02-18</date>
<quantity xmlns="">2</quantity>
<unitPrice xmlns="">20.00</unitPrice>
</item></itemList>
<currencyCode xmlns="">USD</currencyCode>
<paymentTerms xmlns="">DueOnReceipt</paymentTerms>
<note xmlns="">This is a test invoice.</note>
<merchantMemo xmlns="">This is a test invoice.</merchantMemo>
<billingInfo xmlns="">
<firstName xmlns="">Tester</firstName>
<lastName xmlns="">Testerson</lastName>
<businessName xmlns="">Testers, LLC</businessName>
<phone xmlns="">555-555-5555</phone>
<fax xmlns="">555-555-5556</fax>
<website xmlns="">http://www.domain.com</website>
<customValue xmlns="">Some custom info.</customValue>
<address xmlns="">
<line1 xmlns="">123 Main St.</line1>
<city xmlns="">Grandview</city>
<state xmlns="">MO</state>
<postalCode xmlns="">64030</postalCode>
<countryCode xmlns="">US</countryCode>
</address>
</billingInfo>
<shippingInfo xmlns="">
<firstName xmlns="">Tester</firstName>
<lastName xmlns="">Testerson</lastName>
<businessName xmlns="">Testers, LLC</businessName>
<phone xmlns="">555-555-5555</phone>
<fax xmlns="">555-555-5556</fax>
<website xmlns="">http://www.domain.com</website>
<customValue xmlns="">Some custom info.</customValue>
<address xmlns="">
<line1 xmlns="">123 Main St.</line1>
<city xmlns="">Grandview</city>
<state xmlns="">MO</state>
<postalCode xmlns="">64030</postalCode>
<countryCode xmlns="">US</countryCode>
</address>
</shippingInfo>
<shippingAmount xmlns="">10.00</shippingAmount>
<logoUrl xmlns="">https://www.usbswiper.com/images/angelley-clients/cpp-header-image.jpg</logoUrl>
<referrerCode xmlns="">AngellEYE_PHPClass</referrerCode>
</invoice>
</CreateInvoiceRequest>

how to Check if a XML child element exists with Linq to XML

How can I check if IncomingConfig element exists by use linq to xml?
<?xml version="1.0" encoding="utf-8"?>
<settings>
<IncomingConfig>
<ip>10.100.101.18</ip>
<port>5060</port>
</IncomingConfig>
<Device>
<username>tarek</username>
<AgentName>tarek</AgentName>
<password>ffff</password>
</Device>
<Device>
<username>adf</username>
<AgentName>adf</AgentName>
<password>fadsf</password>
</Device>
</settings>
bool b = xdocument.Descendants("IncomingConfig").Any();

Categories