XElement автоматически имеет атрибут xmlns

Dim soapEnvelope As XElement = New XElement(soap + "Envelope",
                                        New XAttribute(XNamespace.Xmlns + "soap", soap.NamespaceName),
                                        New XAttribute(soap + "encodingStyle", "http://www.w3.org/2001/12/soap-encoding"),
                                        New XElement(soap + "Body",
                                        New XAttribute("xmlns", "http://www.test.com"),
                                        New XElement("Open",
                                        New XElement("Data",
                                        New XElement("Desc", _dData.Desc),
                                        New XElement("Num", _dData.Num),
                                        New XElement("Ref", _dData.Ref),
                                        New XElement("Mnn", _dData.Mnn),
                                        New XElement("Ftp", _dData.Ftp))
                                  )))

Следующее дает этот вывод:

<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">
  <soap:Body xmlns="http://www.test.com">
    <Open xmlns="">
      <Data>
        <Desc>testApp</Desc>
        <Num>1</Num>
        <Ref></Ref>
        <Mnn>116</Mnn>
        <Ftp></Ftp>
      </Data>
    </Open>
  </soap:Body>
</soap:Envelope>

Вопрос в том, почему <Open> XElement автоматически получает атрибут xmlns=""?

Я хочу такой же вывод, но без каких-либо атрибутов XElement <Open>

Любая помощь будет оценена по достоинству.


person HelpASisterOut    schedule 30.09.2014    source источник


Ответы (2)


Это связано с тем, что XML имеет пространство имен по умолчанию (xmlns="..."), объявленное в элементе <Open>. В XML все элементы-потомки автоматически наследуют пространство имен по умолчанию от предка, если явно не указано иное (например, с помощью префикса, указывающего на другое пространство имен, или путем объявления другого пространства имен по умолчанию на уровне потомка).

Используя код, который вы пробовали, потомки <Body> не устанавливаются ни в одном пространстве имен. Вам нужно установить потомков элемента <Open> в одно и то же пространство имен по умолчанию, используя XNamespace, например:

XNamespace ns = "http://www.test.com"
Dim soapEnvelope As XElement = New XElement(soap + "Envelope",
                                        New XAttribute(XNamespace.Xmlns + "soap", soap.NamespaceName),
                                        New XAttribute(soap + "encodingStyle", "http://www.w3.org/2001/12/soap-encoding"),
                                        New XElement(soap + "Body",
                                        New XAttribute("xmlns", "http://www.test.com"),
                                        New XElement(ns+"Open",
                                        New XElement(ns+"Data",
                                        New XElement(ns+"Desc", _dData.Desc),
                                        New XElement(ns+"Num", _dData.Num),
                                        New XElement(ns+"Ref", _dData.Ref),
                                        New XElement(ns+"Mnn", _dData.Mnn),
                                        New XElement(ns+"Ftp", _dData.Ftp))
                                  )))
person har07    schedule 30.09.2014

Вам нужно создать каждый элемент в своем пространстве имен:

XNamespace t = "http://www.test.com";
                                      New XElement(t + "Open",
                                        New XElement(t + "Data",
                                        New XElement(t + "Desc", _dData.Desc),
                                        New XElement(t + "Num", _dData.Num),
                                        New XElement(t + "Ref", _dData.Ref),
                                        New XElement(t + "Mnn", _dData.Mnn),
                                        New XElement(t + "Ftp", _dData.Ftp))
person Martin Honnen    schedule 30.09.2014