簡體   English   中英

刪除 p2:type="&lt;<type> &gt;" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" 來自 xml</type>

[英]Remove p2:type="<<type>>" xmlns:p2="http://www.w3.org/2001/XMLSchema-instance" from xml

如何從 xml 的所有內部節點中刪除 xmlns。 我能夠從根節點中刪除 xmlns,但內部節點仍然具有內部節點中的所有 xmlns。

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();
            }
        }
    }

Output 是

<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>

預期 output 是

<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>();

然后刪除你的包括我永遠把我弄清楚這個

就我而言,output 是這樣的:

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

xmlns 污染了子屬性,當屬性為空(null)並且 class 中的屬性名稱被固定時,就會發生這種情況
IsNullable = true

喜歡:

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

因此,如果您想從子屬性中刪除 xmlns:p2 ,只需將其更改為 false :

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM