Как добавить 2 пространства имен в xml-документ с помощью XNamespace

#c# #xml #xml-namespaces

#c# #xml #xml-пространства имен

Вопрос:

Я пытаюсь создать xml с 2 пространствами имен, одно без какого-либо префикса, а другое с префиксом. Моя проблема в том, что я помещаю оба в качестве атрибутов.

Я перепробовал много решений, некоторые выдают неверный вывод, другие код ошибки, например «System.Xml.XmlException: ‘Префикс «не может быть переопределен из»

 XNamespace ns1 = "http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_enviar_lote_rps_envio.xsd", tc = "http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd";
            el.Xmlns = "http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_enviar_lote_rps_envio.xsd";

XDocument xdoc = new XDocument(
                new XDeclaration("1.0", "utf-8",""),
                new XElement(ns1 "EnviarLoteRpsEnvio",
                  //  new XAttribute("xmlns" ,ns1), <- HERE IS THE ISSUE
                    new XAttribute(XNamespace.Xmlns   "tc", "http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd"),
                       new XElement("LoteRps",
                new XElement(tc   "NumeroLote",loteRps.NumeroLote),
                   new XElement(tc   "CpfCnpj",
                        new XElement(tc   "Cnpj", cnpj.Cnpj)
                                )
                        , new XElement(tc   "InscricaoMunicipal", loteRps.InscricaoMunicipal)
                        , new XElement(tc   "QuantidadeRps", loteRps.QuantidadeRps)
                        , ListaRps
                        )));



            string loteenvio = "-env-loterps.xml";
            string filename = cnpj.Cnpj   loteRps.NumeroLote   loteenvio;

            xdoc.Save(filename);
  

Мой фактический результат:

 <?xml version="1.0" encoding="utf-8"?>
<EnviarLoteRpsEnvio xmlns:tc="http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd" xmlns="http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_enviar_lote_rps_envio.xsd">
  <LoteRps xmlns="">
    <tc:NumeroLote>1</tc:NumeroLote>
    <tc:CpfCnpj>
      <tc:Cnpj>123456789</tc:Cnpj>
    </tc:CpfCnpj>
  

Когда мне нужно, это:

 <?xml version="1.0" encoding="utf-8"?>
<EnviarLoteRpsEnvio xmlns="http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_enviar_lote_rps_envio.xsd" xmlns:tc="http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd">
  <LoteRps>
    <tc:NumeroLote>1</tc:NumeroLote>
    <tc:CpfCnpj>
      <tc:Cnpj>123456789</tc:Cnpj>
    </tc:CpfCnpj>
  

Комментарии:

1. Почему вы не используете точно такой же код для узла «LoteRps», который вы использовали для «EnviarLoteRpsEnvio» ( new XElement(ns1 "EnviarLoteRpsEnvio" поскольку оба должны иметь одинаковое пространство имен)?

2. Поскольку это не элемент, это свойство элемента «EnviarLoteRpsEnvio».

3. У XML нет «свойств» — у него есть только элементы и атрибуты. Я совершенно сбит с толку тем, что вы имеете в виду «это не элемент, это свойство»…

4. Я имею в виду атрибут, была ошибка при именовании. Я нашел решение, опубликованное ниже. Tks.

Ответ №1:

Найдено решение! Я ссылаюсь на Документы Microsoft и, наконец, решил это с помощью этого кода:

  XDocument xdoc = new XDocument(
                new XDeclaration("1.0", "utf-8",""),
                new XElement(ns1 "EnviarLoteRpsEnvio"
                    ,new XAttribute ("xmlns","http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_enviar_lote_rps_envio.xsd")
                    ,new XAttribute(XNamespace.Xmlns   "tc", "http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd")
                       ,new XElement(ns1 "LoteRps",
                new XElement(tc   "NumeroLote",loteRps.NumeroLote),
  

Моей замечательной уловкой было «ns1 » перед дочерним элементом, что приводит к этому XML:

 <?xml version="1.0" encoding="utf-8"?>
<EnviarLoteRpsEnvio xmlns="http://www.issnetonline.com.br/webserviceabrasf/vsd/servico_enviar_lote_rps_envio.xsd" xmlns:tc="http://www.issnetonline.com.br/webserviceabrasf/vsd/tipos_complexos.xsd">
  <LoteRps>
    <tc:NumeroLote>1</tc:NumeroLote>
    <tc:CpfCnpj>