Несколько пространств имен в XMLSerializer [VB.NET] - PullRequest
0 голосов
/ 10 сентября 2018

Я работаю над сайтом, и мне нужно создать XML. Это первый раз, когда я использую XMLSerializer, и у меня возникли некоторые проблемы, поэтому я надеюсь, что вы, ребята, сможете мне помочь. Вот моя проблема ...

Я использовал xsd2code для генерации своих классов для сериализатора, и почти все, кажется, работает нормально, за исключением пространств имен.

Это моя цель:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<p:DCTRequest xmlns:p="http://www.dhl.com" xmlns:p1="http://www.dhl.com/datatypes" xmlns:p2="http://www.dhl.com/DCTRequestdatatypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.dhl.com DCT-req.xsd ">
   <GetQuote>
   .
   .
   .
   </GetQuote>
</p:DCTRequest>

и вот код, который я написал:

    Dim DHLReq As New DHLRequestXML.DCTRequest
    Dim DHLQuoteXML As New DHLRequestXML.DCTRequestGetQuote

    DHLQuoteXML.Request = GenerateXMLRequest()
    DHLQuoteXML.From = GenerateXMLFrom()
    DHLQuoteXML.BkgDetails = GenerateXMLBKGDetails()
    DHLQuoteXML.To = GenerateXMLTo()
    DHLQuoteXML.Dutiable = GenerateXMLDutiable()
    DHLReq.Item = DHLQuoteXML

    DHLQuoteXML.RequestSpecified = True
    DHLQuoteXML.FromSpecified = True
    DHLQuoteXML.BkgDetailsSpecified = True
    DHLQuoteXML.ToSpecified = True
    DHLQuoteXML.DutiableSpecified = True
    DHLReq.ItemSpecified = True

    Dim stream As MemoryStream = New MemoryStream()
    Dim writer As StreamWriter = New StreamWriter(stream, Encoding.UTF8)

    Dim serializer As New XmlSerializer(GetType(DHLRequestXML.DCTRequest))

    serializer.Serialize(writer, DHLReq)
    txtResult.Text = System.Text.Encoding.UTF8.GetString(stream.ToArray(), 0, stream.Length)

где каждая функция инициализирует нужные мне поля, но мой вывод:

<?xml version="1.0" encoding="utf-8"?>
<DCTRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.dhl.com"> 
   <GetQuote xmlns="">
   .
   .
   .
   </GetQuote>
</DCTRequest>

Я пытался использовать XmlSerializerNamespaces следующим образом:

    Dim DHLReq As New DHLRequestXML.DCTRequest
    Dim DHLQuoteXML As New DHLRequestXML.DCTRequestGetQuote

    DHLQuoteXML.Request = GenerateXMLRequest()
    DHLQuoteXML.From = GenerateXMLFrom()
    DHLQuoteXML.BkgDetails = GenerateXMLBKGDetails()
    DHLQuoteXML.To = GenerateXMLTo()
    DHLQuoteXML.Dutiable = GenerateXMLDutiable()
    DHLReq.Item = DHLQuoteXML

    DHLQuoteXML.RequestSpecified = True
    DHLQuoteXML.FromSpecified = True
    DHLQuoteXML.BkgDetailsSpecified = True
    DHLQuoteXML.ToSpecified = True
    DHLQuoteXML.DutiableSpecified = True
    DHLReq.ItemSpecified = True


    Dim ns As New XmlSerializerNamespaces()
    ns.Add("p", "http://www.dhl.com")
    ns.Add("p1", "http://www.dhl.com/datatypes")
    ns.Add("p2", "http://www.dhl.com/DCTRequestdatatypes")
    ns.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance")


    Dim stream As MemoryStream = New MemoryStream()
    Dim writer As StreamWriter = New StreamWriter(stream, Encoding.UTF8)

    Dim serializer As New XmlSerializer(GetType(DHLRequestXML.DCTRequest))

    serializer.Serialize(writer, DHLReq, ns)
    txtResult.Text = System.Text.Encoding.UTF8.GetString(stream.ToArray(), 0, stream.Length)

и наконец я получил:

<?xml version="1.0" encoding="utf-8"?>
<p:DCTRequest xmlns:p2="http://www.dhl.com/DCTRequestdatatypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="http://www.dhl.com/datatypes" xmlns:p="http://www.dhl.com">
   <GetQuote>
   .
   .
   .
   </GetQuote>
</p:DCTRequest>

Я должен признать, что не понимаю, почему он автоматически добавляет префикс xmlns к p, p1 и p2, почему DCTRequest изменился на p: DCTRequest и почему атрибут xmlns в GetQuote больше не существует, но в любом случае ...

моя проблема в том, что я не знаю, как добавить xsi: schemaLocation = "http://www.dhl.com DCT-req.xsd", так как я не могу написать

ns.Add("xsi:schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")

из-за ":" я не могу написать

ns.Add("schemaLocation", "http://www.w3.org/2001/XMLSchema-instance")

потому что я получу xmlns: schemaLocation в своем выводе ... поэтому я не могу понять, что мне нужно делать.

Не могли бы вы помочь мне, ребята?

Большое спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...