![](/img/trans.png)
[英]remove xmlns:i=“http://www.w3.org/2001/XMLSchema-instance” when using DataContractSerializer
[英]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
的子類型。 序列化程序需要類型屬性來確定所使用的實際類型。
如果您不想要這些屬性並且只有一種類型的“人”,那么您應該折疊Student
和Person
的定義:
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.