У меня есть некоторые полезные данные Xml, которые выглядят следующим образом:
<nm:MyRootElement xmlns:nm="http://test.com/NS1/Global">
<MyRequest>
<ID>123456789</ID>
<Lots>D</Lots>
<Of>abc</Of>
<Other>123</Other>
<Nodes>Z00000002</Nodes>
<etc>wyz</etc>
<InfoWrapper>
<ne:Address xmlns:ne="http://test.com/NS2/Local">
<Name1>Akira Fubuki</Name1>
<Street>1 Hwy To Heaven</Street>
</ne:Address>
<ne:CustomerFields xmlns:ne="http://test.com/NS2/Local">
<RequestorName>Fred Flinstone</RequestorName>
<RequestorTelephoneNumber>123456789</RequestorTelephoneNumber>
</ne:CustomerFields>
</InfoWrapper>
</MyRequest>
<Log>
<SeverityCode>1</SeverityCode>
</Log>
</nm:MyRootElement>
Обратите внимание, как существует внутреннее пространство имен, определенное в Address и CustomerFields;
Я могу десериализовать полезную нагрузку в объект класса хорошо, скажем, payloadObj;
Однако когда я сериализую объект обратно в xml, он всегда помещает пространство имен вверху, как показано ниже:
<nm:MyRootElement xmlns:nm="http://test.com/NS1/Global" xmlns:ne="http://test.com/NS2/Local">
<MyRequest>
<ID>123456789</ID>
<Lots>D</Lots>
<Of>abc</Of>
<Other>123</Other>
<Nodes>Z00000002</Nodes>
<etc>wyz</etc>
<InfoWrapper>
<ne:Address>
<Name1>Akira Fubuki</Name1>
<Street>1 Hwy To Heaven</Street>
</ne:Address>
<ne:CustomerFields>
<RequestorName>Fred Flinstone</RequestorName>
<RequestorTelephoneNumber>123456789</RequestorTelephoneNumber>
</ne:CustomerFields>
</InfoWrapper>
</MyRequest>
<Log>
<SeverityCode>1</SeverityCode>
</Log>
</nm:MyRootElement>
Я знаю, что полезные данные эквивалентны, но есть ли возможность с XmlSerializer заставить пространство имен появляться в определенном элементе, а не всегда в корневом элементе?
Мой код сериализации:
XmlSerializer ser = new XmlSerializer(typeof(MyRootElement));
XmlSerializerNamespaces xsn = new XmlSerializerNamespaces(
new XmlQualifiedName[] {
new XmlQualifiedName ("nm", "http://test.com/NS1/Global"
new XmlQualifiedName ("ne", "http://test.com/NS2/Local")
}
);
using (XmlWriter xw = XmlWriter.Create(outFile))
{
ser.Serialize(xw, payloadObj, xsn);
}