XmlSerializer - может ли он заставить пространство имен отображаться в конкретном элементе? - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть некоторые полезные данные 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);
}
...