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>
Любая помощь будет оценена.
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))
)))
Вам нужно создать каждый элемент в его пространстве имен:
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))