Я работаю над сайтом, и мне нужно создать 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 в своем выводе ... поэтому я не могу понять, что мне нужно делать.
Не могли бы вы помочь мне, ребята?
Большое спасибо