質問

い状況でしたいことが分かったxmlファイルのうんです。のAddAnnotation機能XElementのクラスに追加するオプションを選択メモリ-データだけではない直列化されたとの一部ではありません形式をサポートしています。

こういうことができるように保存しこれらのアノテーション(例えば:別のxmlファイル)を直列化復元のxmlに注釈を得るために同じオブジェクトでけがをしてしまいました。

ならないようにしたいの変更は元のxmlおよびその理由を使っていたアンソロジー。

以上をまとめますと、こういうことができるように追加カスタムデータをxmlファイルとなります。このデータなのxml時serializeいものを参照することができるものとのxmlがいをお引き取りのオリジナルのxmlす。

ついての勧告をどんなこんなことをしたのだろう。

編集: どちらを使うべきxml処理の指示?加工指示書を対象にこのような?

役に立ちましたか?

解決

最も簡単な方法は、通常のノードを使用することであろうように、

それは私に聞こえるが、異なるXML名前空間に - 。すなわち

<foo standardAttrubute="abc" myData:customAttribute="def">
    <standardElement>ghi</standardElement >
    <myData:customElement>jkl</myData:customElement>
</foo>

myDataは、名前空間URIのxmlns別名である)

多くの場合、読者は、の自分のの名前空間(またはデフォルト/空白の名前空間)内のデータをチェックしている - カスタム名前空間の値は、一般的にスキップされます。

元のXMLを詰める取得するには、1つの単純なアプローチは、デフォルトの/元の名前空間を尊重し、XSLTを介して実行することです。

<時間>
XNamespace myData = XNamespace.Get("http://mycustomdata/");
XElement el = new XElement("foo",
    new XAttribute(XNamespace.Xmlns + "myData", myData.NamespaceName),
    new XAttribute("standardAttribute", "abc"),
    new XAttribute(myData + "customAttribute", "def"),
    new XElement("standardElement", "ghi"),
    new XElement(myData + "customAttribute", "jkl"));
string s = el.ToString();

おそらく、XElementからそのようなデータを削除する

    static void Strip(XElement el, XNamespace ns) {
        List<XElement> remove = new List<XElement>();
        foreach (XElement child in el.Elements()) {
            if (child.Name.Namespace == ns) {
                remove.Add(child);
            } else {
                Strip(child, ns);
            }
        }
        remove.ForEach(child => child.Remove());

        foreach (XAttribute child in
            (from a in el.Attributes()
             where a.Name.Namespace == ns
             select a).ToList()) {
            child.Remove();
        }
    }

他のヒント

元の問題"という言葉を使い"Serialize"もしもXElementとアノテーション.私はこれらに違います。

またXmlSerializer:
んで使用XmlAttributeOverrides他との差別化を図るため、直列化します。のXmlAttributeOverridesできるプログラムにより、ランタイム時において、オーバーライドは、xmlを直列化する属性を飾ります。

内型というのは、分野/物件はアノテーション/ドキュメンテーション.飾ることXmlIgnore.そして、一つのインスタンスXmlSerializerを受け入れるのないオーバーライド.アノテーションは直列化されたデ-直列化されます。を別のインスタンスXmlSerializerは、その型を用いて、XmlAttributeOverridesオブジェクトです。指定のオーバーライドのXmlIgnoreい物件(使用XmlElementAttribute)とオーバーライドのための任意の属性のいずれかのメンバー(使用XmlIgnore=true)。

Serializeのインスタンスを回は、各シリアライザ.


編集:こちらのコード:

public class DTO
{
    [XmlIgnore]
    public string additionalInformation;

    [XmlElement(Order=1)]
    public DateTime stamp;

    [XmlElement(Order=2)]
    public string name;

    [XmlElement(Order=3)]
    public double value;

    [XmlElement(Order=4)]
    public int index;
}



public class OverridesDemo
{ 
    public void Run()
    {
        DTO dto = new DTO
            {
                additionalInformation = "This will bbe serialized separately",
                stamp = DateTime.UtcNow,
                name = "Marley",
                value = 72.34,
                index = 7
            };


        // ---------------------------------------------------------------
        // 1. serialize normally
        // this will allow us to omit the xmlns:xsi namespace
        var ns = new XmlSerializerNamespaces();
        ns.Add( "", "" );

        XmlSerializer s1 = new XmlSerializer(typeof(DTO));

        var builder = new System.Text.StringBuilder();
        var settings = new XmlWriterSettings { OmitXmlDeclaration = true, Indent= true };

        Console.WriteLine("\nSerialize using the in-line attributes: ");
        using ( XmlWriter writer = XmlWriter.Create(builder, settings))
        {
            s1.Serialize(writer, dto, ns);
        }
        Console.WriteLine("{0}",builder.ToString());
        Console.WriteLine("\n");            
        // ---------------------------------------------------------------

        // ---------------------------------------------------------------
        // 2. serialize with attribute overrides
        // use a non-empty default namespace
        ns = new XmlSerializerNamespaces();
        string myns = "urn:www.example.org";
        ns.Add( "", myns);

        XmlAttributeOverrides overrides = new XmlAttributeOverrides();

        XmlAttributes attrs = new XmlAttributes();
        // override the (implicit) XmlRoot attribute
        XmlRootAttribute attr1 = new XmlRootAttribute
            {
                Namespace = myns,
                ElementName = "DTO-Annotations",
            };
        attrs.XmlRoot = attr1;

        overrides.Add(typeof(DTO), attrs);
        // "un-ignore" the first property
        // define an XmlElement attribute, for a type of "String", with no namespace
        var a2 = new XmlElementAttribute(typeof(String)) { ElementName="note", Namespace = myns };

        // add that XmlElement attribute to the 2nd bunch of attributes
        attrs = new XmlAttributes();
        attrs.XmlElements.Add(a2);
        attrs.XmlIgnore = false; 

        // add that bunch of attributes to the container for the type, and
        // specifically apply that bunch to the "additionalInformation" property 
        // on the type.
        overrides.Add(typeof(DTO), "additionalInformation", attrs);

        // now, XmlIgnore all the other properties
        attrs = new XmlAttributes();
        attrs.XmlIgnore = true;       
        overrides.Add(typeof(DTO), "stamp", attrs);
        overrides.Add(typeof(DTO), "name",  attrs);
        overrides.Add(typeof(DTO), "value", attrs);
        overrides.Add(typeof(DTO), "index", attrs);

        // create a serializer using those xml attribute overrides
        XmlSerializer s2 = new XmlSerializer(typeof(DTO), overrides);

        Console.WriteLine("\nSerialize using the override attributes: ");
        builder.Length = 0;
        using ( XmlWriter writer = XmlWriter.Create(builder, settings))
        {
            s2.Serialize(writer, dto, ns);
        }
        Console.WriteLine("{0}",builder.ToString());
        Console.WriteLine("\n");            
        // ---------------------------------------------------------------
    }
}

出力を使用し、インライン属性は:

<DTO>
  <stamp>2009-06-30T02:17:35.918Z</stamp>
  <name>Marley</name>
  <value>72.34</value>
  <index>7</index>
</DTO>

出力は、属性のオーバーライド:

<DTO-Annotations xmlns="urn:www.example.org">
  <note>This will bbe serialized separately</note>
</DTO-Annotations>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top