【问题标题】:C# | How do I change the namespace in an XML document?C# |如何更改 XML 文档中的命名空间?
【发布时间】:2021-11-28 23:17:18
【问题描述】:

所以我正在努力更改 XML 中特定节点的命名空间。

这就是我想要实现的目标:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.justapage.com/webservices/">
  <SOAP-ENV:Body>
    <ns1:products_Update>
      <ns1:login>
       ...
      </ns1:login>
      <ns1:products>
        <ns1:product>
          ...
        </ns1:product>
      </ns1:products>
    </ns1:products_Update>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

但结果总是这样:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.justapage.com/webservices/">
  <SOAP-ENV:Body>
    <SOAP-ENV:products_Update>
      <SOAP-ENV:login>
       ...
      </SOAP-ENV:login>
      <SOAP-ENV:products>
        <SOAP-ENV:product>
          ...
        </SOAP-ENV:product>
      </SOAP-ENV:products>
    </SOAP-ENV:products_Update>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这就是我序列化它的方式:

 public static async Task<string> SerializeSendMessage<T>(this T toSerialize)
    {
        string returnString;
       
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Encoding = Encoding.UTF8;

        XmlSerializer xsSubmit = new XmlSerializer(typeof(T));
        using (StringWriter sw = new StringWriter())
        using (XmlWriter writer = XmlWriter.Create(sw))
        {
          
            var xmlns = new XmlSerializerNamespaces();
            xmlns.Add("soapenv", "http://schemas.xmlsoap.org/soap/envelope/");
            xmlns.Add("ns1", "http://www.justapage.com/webservices/");

            xsSubmit.Serialize(writer, toSerialize,xmlns);
            returnString = sw.ToString(); // Your XML
        }

        return returnString;
    }

班级:

[XmlRoot(ElementName="Envelope",IsNullable = false)]
    public class ArticleEnvelope
    {
        [XmlElement(ElementName = "Body",Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
        public Body Body { get; set; }

        [XmlAttribute(AttributeName = "SOAP-ENV")]
        public string SOAPENV { get; set; }

        [XmlAttribute(AttributeName = "ns1")]
        public string Ns1 { get; set; }

        [XmlText]
        public string Text { get; set; }
    }

    [XmlRoot(ElementName = "Body")]
    public class Body
    {
        [XmlElement(ElementName = "products_Update")]
        public ProductsUpdate ProductsUpdate { get; set; }
    }

   [XmlRoot(ElementName = "products_Update")]
    public class ProductsUpdate
    {

        [XmlElement(ElementName = "login")]
        public Login Login { get; set; }

        [XmlElement(ElementName = "products")]
        public Products Products { get; set; }
    }

[XmlRoot(ElementName = "products")]
 public class Products
    {
     
        [XmlElement(ElementName = "product")]
        public List<Product> Product { get; set; }
    }
}

我试图找到一些关于此的信息,但没有成功,我现在希望这里的人可以为我指出如何实现这一目标的正确方向。

【问题讨论】:

  • 好吧,向我们展示您使用的类型 T 的类以及您填充的该类的实例。
  • 对于[XmlElement(ElementName = "products_Update")],您似乎更希望拥有[XmlElement(ElementName = "products_Update", Namespace = "http://www.justapage.com/webservices/")]

标签: c# xml .net-core


【解决方案1】:

尝试以下:

using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO;
using System.Text;
using System.Collections.Generic;

namespace ConsoleApp2
{
    class Program
    {
        static ArticleEnvelope envelope { get; set; }
        static void Main(string[] args)
        {
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = Encoding.UTF8;


            XmlSerializer xsSubmit = new XmlSerializer(typeof(ArticleEnvelope));
            using (StringWriter sw = new StringWriter())
            using (XmlWriter writer = XmlWriter.Create(sw))
            {

                var xmlns = new XmlSerializerNamespaces();
                xmlns.Add("SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/");
                xmlns.Add("ns1", "http://www.justapage.com/webservices/");

                xsSubmit.Serialize(writer, envelope, xmlns);
            }
    }
    [XmlRoot(ElementName = "Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/", IsNullable = false)]
    public class ArticleEnvelope
    {
        [XmlElement(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")]
        public Body Body { get; set; }

        [XmlText]
        public string Text { get; set; }
    }

    public class Body
    {
        [XmlElement(ElementName = "products_Update", Namespace = "http://www.justapage.com/webservices/")]
        public ProductsUpdate ProductsUpdate { get; set; }
    }

    public class ProductsUpdate
    {

        [XmlElement(ElementName = "login", Namespace = "http://www.justapage.com/webservices/")]
        public Login Login { get; set; }

        [XmlArray(ElementName = "products", Namespace = "http://www.justapage.com/webservices/")]
        [XmlArrayItem(ElementName = "product", Namespace = "http://www.justapage.com/webservices/")]
        public List<Product> Products { get; set; }
    }
    public class Login
    {

    }

    public class Product
    {

    }

}

【讨论】:

  • 谢谢你,这工作完美无缺!只需添加 XmlArray 装饰和 XmlArrayItem 就可以了。
  • 它不会修复命名空间。
猜你喜欢
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
相关资源
最近更新 更多