Я использую XmlSerializer для вывода моей объектной модели в XML. Все работает очень хорошо, но теперь мне нужно добавить несколько строк готового XML к объекту без создания классов для каждой строки. После многих поисков я обнаружил, что могу преобразовать строку xml в XmlElement, используя вызовы XxDocument LoadXml и DocumentElement. Я получаю XML, я хочу, за исключением того, что секция строки имеет пустое пространство имен. Как я могу удалить пустой атрибут пространства имен? Есть ли лучший способ добавить строку xml к объекту и обеспечить ее правильную сериализацию?Как удалить пустой атрибут пространства имен при добавлении вручную xml-строки при сериализации объекта?
Примечание: Я создаю только вывод, поэтому мне не нужно десериализовать созданный XML. Я довольно новичок в мире C#, .NET и, следовательно, XmlSerialize.
Вот мой код:
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
public XmlElement Extension { get; set; }
public Book()
{
}
public void AddExtension()
{
string xmlString = "<AdditionalInfo>" +
"<SpecialHandling>Some Value</SpecialHandling>" +
"</AdditionalInfo>";
this.Extension = GetElement(xmlString);
}
public static XmlElement GetElement(string xml)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
return doc.DocumentElement;
}
}
static void Main(string[] args)
{
TestSerialization p = new TestSerialization();
Book bookOne = new Book();
bookOne.Title = "How to Fix Code";
bookOne.Author = "Dee Bugger";
bookOne.AddExtension();
System.Xml.Serialization.XmlSerializer serializer = new XmlSerializer(typeof(Book), "http://www.somenamespace.com");
using (var writer = new StreamWriter("C:\\BookReport.xml"))
using (var xmlWriter = XmlWriter.Create(writer, new XmlWriterSettings { Indent = true }))
{
serializer.Serialize(xmlWriter, bookOne);
}
}
Вот мой результат:
<?xml version="1.0" encoding="utf-8"?>
<Book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.somenamespace.com">
<Title>How to Fix Code</Title>
<Author>Dee Bugger</Author>
<Extension>
<AdditionalInfo xmlns="">
<SpecialHandling>Some Value</SpecialHandling>
</AdditionalInfo>
</Extension>
</Book>
Именно Xmlns = "" на AdditionalInfo, что я хочу устранить. Я считаю, что это выходит из-за отсутствия связи между созданным XmlDocument и корневым сериализованным объектом, поэтому XmlDocument создает собственное пространство имен. Как я могу рассказать XmlDocument (и действительно, сгенерированный XmlElement), что он принадлежит к тому же пространству имен, что и сериализованный объект?
Спасибо Чарльз. Это означает, что я должен добавить его также в линию SpecialHandling. Я не буду строить строку, просто добавив ее в объект. Мне пришлось бы разбирать строку и добавлять пространство имен в каждом подходящем месте. Я посмотрел на XmlDocument, LoadXml и DocumentElement в надежде просто установить пространство имен один раз, но похоже, что это не так. У меня отсутствует опция? Является ли этот подход правильным даже для добавления большого количества xml для сериализации? – sldorman
@sldorman no, строка, как указано выше, - это все, что вам нужно. Пространство имен по умолчанию наследуется (следовательно, оно добавило только один элемент 'xmlns =" "', и в более широком документе есть только одно объявление). Если вам сначала нужно разобрать XML, тривиально изменить пространство имен всех элементов, используя LINQ to XML. –
Вы правы. У меня была опечатка, когда я попробовал это, что привело к тому, что вторая строка имела пустое пространство имен. Еще раз спасибо. – sldorman