2016-08-02 1 views
0

J'utilise XmlSerializer pour sortir mon modèle objet en XML. Tout fonctionne très bien mais maintenant j'ai besoin d'ajouter plusieurs lignes de XML pré-construites à l'objet sans construire de classes pour chaque ligne. Après beaucoup de recherche, j'ai trouvé que je peux convertir la chaîne xml en XmlElement en utilisant les appels LoadXml et DocumentElement de XmlDocument. Je reçois le XML que je veux, sauf que la section de la chaîne a un espace de noms vide. Comment puis-je éliminer l'attribut d'espace de nom vide? Existe-t-il un meilleur moyen d'ajouter une chaîne XML à l'objet et de le sérialiser correctement?Comment faire pour supprimer l'attribut empty namespace sur la chaîne XML ajoutée manuellement lors de la sérialisation de l'objet?

Remarque: Je ne crée que des sorties, donc je n'ai pas besoin de désérialiser le XML généré. Je suis assez nouveau dans le monde C#, .NET et, par conséquent, XmlSerialize.

Voici mon code:

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

Voici ma sortie:

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

Il est le xmlns = "" sur AdditionalInfo que je veux éliminer. Je crois que cela sort parce qu'il n'y a aucune association entre le XmlDocument que j'ai créé et l'objet sérialisé racine, ainsi le XmlDocument crée son propre espace de noms. Comment puis-je dire au XmlDocument (et vraiment, le XmlElement généré) qu'il appartient au même espace de noms que l'objet sérialisé?

Répondre

0

Ceci est ajouté car les éléments parents ont un espace de noms et votre élément AdditionalInfo non. L'attribut xmlns="" modifie l'espace de noms par défaut pour cet élément et ses enfants.

Si vous voulez vous en débarrasser, alors vous voulez probablement que l'élément AdditionalInfo ait le même espace de noms que son parent. Dans ce cas, vous devez changer votre XML pour ceci:

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

Merci Charles. Cela signifie que je devrais également l'ajouter à la ligne SpecialHandling. Je ne vais pas construire la chaîne, juste l'ajouter à l'objet. Je devrais analyser la chaîne et ajouter l'espace de noms dans chaque emplacement approprié. J'ai regardé XmlDocument, LoadXml, et DocumentElement dans l'espoir de juste définir l'espace de noms une fois mais il ne semble pas y avoir de chemin. Ai-je manqué une option? Cette approche est-elle correcte pour ajouter un volume de xml à sérialiser? – sldorman

+0

@sldorman non, la chaîne ci-dessus est tout ce dont vous avez besoin. L'espace de noms par défaut est hérité (par conséquent, il n'a ajouté qu'un seul 'xmlns =" ​​"' avant, et il n'y a qu'une seule déclaration dans le document plus large). Si vous devez d'abord analyser le code XML, il est trivial de modifier l'espace de nom de tous les éléments en utilisant LINQ to XML. –

+0

Vous avez raison. J'ai eu une faute de frappe quand je l'ai essayé, ce qui a fait que la deuxième ligne avait un espace de noms vide. Merci encore. – sldorman