从 xml 中删除 p2:type= "<<type>>" xmlns:p2= "http://www.w3.org/2001/XMLSchema-instance"



如何从XML的所有内部节点中删除XMLN。我能够从根节点上删除XMLN,但内在节点仍然具有内在节点中的所有XMLN。

public class Program
{
    public static void Main()
    {
        List<Person> students = new List<Person>();
        Student std1 = new Student() { Name="Name1", StudentId = 1};
        students.Add(std1);
        Student std2 = new Student() { Name = "Name2", StudentId = 2 };
        students.Add(std2);
        string data = students.ToList().ToXML();
    }
}
[System.Xml.Serialization.XmlInclude(typeof(Student))]
public class Person
{
    public string Name { get; set; }
}
public class Student : Person
{
    public int StudentId { get; set; }
}

toxml((

public static string ToXML<T>(this T value)
    {
        if (value.IsNull()) return string.Empty;
        var xmlSerializer = new XmlSerializer(typeof(T));
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("", "");
        using (var stringWriter = new StringWriter())
        {
            using (var xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings { OmitXmlDeclaration = true, Indent = false }))
            {
                xmlSerializer.Serialize(xmlWriter, value, ns);
                return stringWriter.ToString();
            }
        }
    }

输出是

<ArrayOfPerson>
    <Person p2:type="Student" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance">
        <Name>Name1</Name>
        <StudentId>1</StudentId>
    </Person>
    <Person p2:type="Student" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance">
        <Name>Name2</Name>
        <StudentId>2</StudentId>
    </Person>
</ArrayOfPerson>

预期输出为

<ArrayOfPerson>
    <Person>
        <Name>Name1</Name>
        <StudentId>1</StudentId>
    </Person>
    <Person>
        <Name>Name2</Name>
        <StudentId>2</StudentId>
    </Person>
</ArrayOfPerson>

在代码中执行XML序列化后,您可以从此答案中应用removeallNamespaces((函数:如何使用C#?

从XML中删除所有名称空间

这是因为您正在序列化Person的列表,但正在使用Student的子类型。串行器需要确定所使用的实际类型所需的类型属性。

如果您不想要这些属性,并且只有一种类型的"人",那么您应该折叠StudentPerson的定义:

public class Person
{
    public string Name { get; set; }
    public int StudentId { get; set; }
}
[XmlElement("Person", Type = typeof(Student))]
List<Person> students = new List<Person>();

然后删除您的包含带我永远弄清楚这个

在我的情况下,输出就是这样:

<ArrayOfPerson>
    <Person>
        <Name xmlns:p2="http://www.w3.org/2001/XMLSchema-instance"/>
        <StudentId>1</StudentId>
    </Person>
</ArrayOfPerson>

XMLNS污染了儿童财产,当属性为空(NULL(和类中的属性名称时,这就是发生这种情况 IsNullable = true

喜欢:

[XmlElement(IsNullable = true)]
public string Name { get; set; }

因此,如果要删除xmlns:p2从儿童属性中:

[XmlElement(IsNullable = false)]
public string Name { get; set; }

最新更新