XmlSerializerを使用してシリアル化しているクラスがあります。他のプロパティに加えて、あらかじめ構築されたxmlのチャンクをオブジェクトに追加する必要があります。私はすでにこのポストでxmlのチャックを扱うように頼んだ:How to remove empty namespace attribute on manually added xml string when serializing object?プロパティの属性をシリアル化するか、クラス階層をスキップする方法
これでXML文字列を含むプロパティに属性を追加する必要がある。私はクラスに属性を追加する方法を理解していますが、プロパティには追加しません。属性を保持するための新しいクラスを作成すると、出力に余分な階層ができます。ここで
は私の簡素化コードです:
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 xmlns=\"http://www.somenamespace.com\">" +
"<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="http://www.somenamespace.com">
<SpecialHandling>Some Value</SpecialHandling>
</AdditionalInfo>
</Extension>
</Book>
今、私のような拡張出力に見えるように拡張に属性を追加する必要があります。
を...
<Extension Modifier="ABC">
<AdditionalInfo xmlns="http://www.somenamespace.com">
<SpecialHandling>Some Value</SpecialHandling>
</AdditionalInfo>
</Extension>
Bookクラスを変更する方法はありますか?私は、XML文字列の修飾属性とのXmlElementを保持するための拡張クラスを作成しようとしましたが、それは余分なレベルの結果:
public class Extension
{
[XmlAttribute]
public string Modifier { get; set; }
[XmlElementAttribute("Extension")]
public XmlElement ExtensionAsElement { get; set; }
public Extension()
{
}
public Extension(XmlElement extensionAsElement)
{
this.Modifier = "ABC";
this.ExtensionAsElement = extensionAsElement;
}
}
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
[XmlElementAttribute("Extension")]
public Extension ExtensionObj { get; set; }
public Book()
{
}
public void AddExtension()
{
string xmlString = "<AdditionalInfo xmlns=\"http://www.somenamespace.com\">" +
"<SpecialHandling>Some Value</SpecialHandling>" +
"</AdditionalInfo>";
this.ExtensionObj = new Extension(GetElement(xmlString));
}
public static XmlElement GetElement(string xml)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
return doc.DocumentElement;
}
}
<?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 Modifier="ABC">
<Extension>
<AdditionalInfo xmlns="http://www.somenamespace.com">
<SpecialHandling>Some Value</SpecialHandling>
</AdditionalInfo>
</Extension>
</Extension>
</Book>
注:これは私のコードの過度に単純化した例であり、Bookクラスがあります私のルートではありません。私はシリアライズするだけで、デシリアライズする必要はありません。
ありがとうございました@ dbc。私はXmlAnyElementが異なるタイプの配列に使われているのを見ただけでした。これは非常に役に立ち、私の問題を解決しました! – sldorman
申し訳ありませんが、私は考えていました:) – sldorman