2016-08-02 26 views
0

Ich verwende XmlSerializer, um mein Objektmodell in XML auszugeben. Alles funktioniert sehr gut, aber jetzt muss ich dem Objekt mehrere vorgefertigte XML-Zeilen hinzufügen, ohne für jede Zeile Klassen zu erstellen. Nach vielen Suchen habe ich festgestellt, dass ich die XML-Zeichenfolge in ein XmlElement mit XmlDocument LoadXml und DocumentElement-Aufrufe konvertieren kann. Ich bekomme das XML, das ich möchte, außer dass der String-Abschnitt einen leeren Namespace hat. Wie kann ich das leere Namespace-Attribut entfernen? Gibt es eine bessere Möglichkeit, dem Objekt eine XML-Zeichenfolge hinzuzufügen und sie ordnungsgemäß serialisieren zu lassen?Wie entfernt man das leere Namespace-Attribut bei manuell hinzugefügten XML-Strings, wenn das Objekt serialisiert wird?

Hinweis: Ich erstelle nur eine Ausgabe, so dass ich das generierte XML nicht deserialisieren muss. Ich bin ziemlich neu in der C#, .NET Welt und daher XmlSerialize.

Hier ist mein 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); 
    } 
} 

Hier ist meine Ausgabe:

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

Es ist die xmlns = "" auf AdditionalInfo, die ich beseitigen wollen. Ich glaube, das kommt heraus, weil es keine Verbindung zwischen dem XmlDocument, das ich erstellt habe, und dem serialisierten Stammobjekt gibt, so dass das XmlDocument seinen eigenen Namespace erstellt. Wie kann ich dem XmlDocument (und wirklich dem generierten XmlElement) mitteilen, dass es zum selben Namespace gehört wie das serialisierte Objekt?

Antwort

0

Dies wird hinzugefügt, weil die übergeordneten Elemente einen Namespace haben und Ihr AdditionalInfo -Element dies nicht tut. Das Attribut xmlns="" ändert den Standardnamespace für dieses Element und seine untergeordneten Elemente.

Wenn Sie es loswerden wollen, dann soll das Element AdditionalInfo vermutlich denselben Namespace haben wie das übergeordnete Element. In diesem Fall müssen Sie Ihren XML-Code folgendermaßen ändern:

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

Vielen Dank Charles. Das heißt, ich müsste es auch in die SpecialHandling-Linie aufnehmen. Ich werde die Zeichenfolge nicht erstellen und sie nur zum Objekt hinzufügen. Ich müsste die Zeichenfolge analysieren und den Namespace an jedem richtigen Ort hinzufügen. Ich schaute auf XmlDocument, LoadXml und DocumentElement in der Hoffnung, nur einmal den Namespace zu setzen, aber es scheint keinen Weg zu geben. Fehle ich eine Option? Ist dieser Ansatz sogar richtig, um eine Menge von xml hinzuzufügen, die serialisiert werden soll? – sldorman

+0

@sldorman Nein, die Zeichenfolge wie oben ist alles, was Sie brauchen würden. Der Standard-Namespace wird vererbt (daher wurde vorher nur ein einziges 'xmlns =" ​​"' hinzugefügt, und im weiteren Dokument gibt es nur eine einzige Deklaration). Wenn Sie das XML zuerst analysieren müssen, ist es einfach, den Namespace aller Elemente mit LINQ to XML zu ändern. –

+0

Sie haben Recht. Ich hatte einen Tippfehler, als ich versuchte, dass die zweite Zeile einen leeren Namensraum hatte. Danke noch einmal. – sldorman