como adicionar (ou ignorar) namespace XML ao usar XElement.Load
-
12-09-2019 - |
Pergunta
Estou criando XML usando Linq para XML e C #. Tudo funciona muito bem exceto quando eu preciso adicionar manualmente em uma linha no XML. Esta linha é adicionada somente se eu tiver um valor para passar para ele, caso contrário eu simplesmente ignorar a tag inteira.
Eu uso XElement.Load de carga na cadeia de texto que eu armazenar em uma corda, mas quando eu anexá-lo ao XML ele sempre coloca em xmlns = "" no final da minha tag.
Existe uma maneira eu posso dizer XElement.Load usar o namespace existente ou para ignorá-lo ao colocar na cadeia para o XML?
Idealmente, eu só quero a minha string a ser incluído para o XML que está sendo criado sem tags extras sendo adicionados.
Abaixo está uma amostra do que eu atualmente fazer:
string XMLDetails = null;
if (ValuePassedThrough != null)
XMLDetails = "<MyNewTag Code=\"14\" Value=\"" + ValuePassedThrough +"\"></MyNewTag>";
Quando eu construir o XML eu carregar a seqüência acima em meu XML. É aqui onde xmlns = "" está sendo adicionado ao valor XMLDetails mas idealmente eu quero isso ignorado, pois está causando problemas com o destinatário quando tentam ler este tag.
XNamespace ns = "http://namespace-address";
XNamespace xsi = "http://XMLSchema-instance-address";
XDocument RequestDoc = new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement(ns + "HeaderTag",
new XAttribute("xmlns", ns),
new XAttribute(XNamespace.Xmlns + "xsi", xsi),
new XAttribute(xsi + "schemaLocation", "http://www.addressofschema.xsd"),
new XAttribute("Version", "1"),
new XElement(ns + "OpeningTAG",
... Meu código XML ...
XElement.Load(new StringReader(XMLDetails))
... End of Code XML ...
Como mencionado acima. Meu código funciona, XML saídas com sucesso para mim. Sua apenas a MyNewTag tag I carga em usar XElement.Load recebe xmlns = "" adicionado ao final do mesmo que está me causando um problema.
Alguma idéia de como posso resolver isso? Obrigado por sua ajuda.
Saudações, Rica
Solução
Como sobre: ??
XElement withoutNamespace = XElement.Load(new StringReader(XMLDetails));
XElement withNamespace = new XElement(ns + withoutNamespace.Name.LocalName,
withoutNamespace.Nodes());
Como uma alternativa melhor - por que você não quer incluir o namespace quando você está construindo o XML, ou melhor ainda, criar um XElement
em vez de gerar manualmente uma seqüência de caracteres XML que você então ler. Manualmente criar XML é muito raramente uma boa idéia. Além de qualquer outra coisa, você está assumindo que ValuePassedThrough
já escapou, ou não precisa escapar etc. Isso pode ser válido -. Mas é pelo menos um motivo de preocupação
Outras dicas
Como este
XElement XMLDetails = new XElement(ns + "OpeningTAG", new XElement(ns + "MyNewTag", new XAttribute("Code", 14), new XAttribute("Value", 123)));
XDocument RequestDoc = new XDocument(
new XDeclaration("1.0", "utf-8", null),
new XElement(ns + "HeaderTag",
new XAttribute("xmlns", ns),
new XAttribute(XNamespace.Xmlns + "xsi", xsi),
new XAttribute(xsi + "schemaLocation", "http://www.addressofschema.xsd"),
new XAttribute("Version", "1"),
XMLDetails));