2016-08-02 3 views
0

XmlSerializerを使用して、オブジェクトモデルをXMLに出力しています。すべてがうまくいきましたが、各行のクラスを構築することなく、オブジェクトに数行の事前構築されたXMLを追加する必要があります。多くの検索の後、XmlDocumentのLoadXmlとDocumentElement呼び出しを使用してxml文字列をXmlElementに変換できることがわかりました。私は、文字列セクションに空の名前空間があることを除いて、私が望むXMLを取得します。空の名前空間属性を削除するにはどうすればよいですか?オブジェクトにxml文字列を追加し、それを適切にシリアル化するより良い方法はありますか?オブジェクトのシリアル化時に手動で追加されたxml文字列の空の名前空間属性を削除するにはどうすればよいですか?

注:生成されたXMLを逆シリアル化する必要はないので、出力を作成するだけです。私はC#、.NETの世界、そしてXmlSerializeについてかなり新しいです。

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

それは私が排除したいAdditionalInfo上のxmlns = "" です:

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

はここに私の出力です:

は、ここに私のコードです。 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いいえ、上記の文字列は必要なものです。デフォルトの名前空間は継承されています(したがって、以前は単一の 'xmlns =" "'が追加されており、より広い文書には1つの宣言しかありません)。最初にXMLを解析する必要がある場合は、LINQ to XMLを使用してすべての要素の名前空間を変更するのは簡単です。 –

+0

あなたはそうです。 2行目が空の名前空間を持つようにしようとしたときにタイプミスがありました。再度、感謝します。 – sldorman

関連する問題