2016-08-02 2 views
0

Я использую 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), что он принадлежит к тому же пространству имен, что и сериализованный объект?

ответ

0

Это добавлено, потому что родительские элементы имеют пространство имен, а ваш элемент AdditionalInfo этого не делает. Атрибут xmlns="" изменяет пространство имен по умолчанию для этого элемента и его дочерних элементов.

Если вы хотите избавиться от него, то предположительно вы хотите, чтобы элемент AdditionalInfo имел такое же пространство имен, что и его родитель. В этом случае вам необходимо сменить свой XML:

string xmlString = @"<AdditionalInfo xmlns=\"http://www.somenamespace.com\">" + 
        "<SpecialHandling>Some Value</SpecialHandling>" + 
        "</AdditionalInfo>"; 
+0

Спасибо Чарльз. Это означает, что я должен добавить его также в линию SpecialHandling. Я не буду строить строку, просто добавив ее в объект. Мне пришлось бы разбирать строку и добавлять пространство имен в каждом подходящем месте. Я посмотрел на XmlDocument, LoadXml и DocumentElement в надежде просто установить пространство имен один раз, но похоже, что это не так. У меня отсутствует опция? Является ли этот подход правильным даже для добавления большого количества xml для сериализации? – sldorman

+0

@sldorman no, строка, как указано выше, - это все, что вам нужно. Пространство имен по умолчанию наследуется (следовательно, оно добавило только один элемент 'xmlns =" ​​"', и в более широком документе есть только одно объявление). Если вам сначала нужно разобрать XML, тривиально изменить пространство имен всех элементов, используя LINQ to XML. –

+0

Вы правы. У меня была опечатка, когда я попробовал это, что привело к тому, что вторая строка имела пустое пространство имен. Еще раз спасибо. – sldorman

Смежные вопросы