0

これは XML サンプルですが、属性を定義するために別のアプローチを使用しています。

<TestXML>
   <TestData attr1="MyAttr" attr2="1" DateAdded="">25</TestData>
</TestXML>

今私のクラス定義:

public class TestXML() {
   [XmlElement("TestData")]
   public IntegerValue value {get; set;}
}

public class IntegerValue() {
   public int value {get; set;}
   [XmlAnyAttribute]
   public string[] XAttributes {get; set;}
}

次に、逆シリアル化するコード:

string xml = "<TestXML><TestData attr1=\"MyAttr\" attr2=\"1\" DateAdded=\"\">25</TestElement> </TestXML>"
using (StringReader sr = new StringReader(xml)) {
   XmlSerializer serializer = new XmlSerializer(typeof(TestXML));
   TestXML myxml = (TestXML)serializer.Deserialize(sr);
}

次の結果が生成されます。

myxml
   value     |  0
   XAttributes  {string[7]}
     [0] "MyAttr"
     [1] "1"
     [2] ""

xml は正しくフォーマットされています。XMLAnyAttribute を使用して逆シリアル化する値を取得できませんでした。属性の値とともに名前を取得したいのですが、これまでのところそのアプローチの例は見つかりませんでした。

4

2 に答える 2

2

これに変更string[] XAttributesするだけXmlAttribute[] XAttributesで、属性全体が返されるため、名前と値にアクセスできます

public class IntegerValue
{
   public int value {get; set;}

   [XmlAnyAttribute]
   public XmlAttribute[] XAttributes { get; set; }
}

私のテスト:

public class TestXML
{
    [XmlElement("TestData")]
    public IntegerValue value { get; set; }
}

public class IntegerValue
{
    public int value { get; set; }

    [XmlAnyAttribute]
    public XmlAttribute[] XAttributes { get; set; }
}


XmlSerializer serializer = new XmlSerializer(typeof(TestXML));
using (FileStream stream = new FileStream(@"C:\StackOverflow.xml", FileMode.Open))
{
    TestXML myxml = (TestXML)serializer.Deserialize(stream);
}

結果:

ここに画像の説明を入力

注: 投稿した xml は無効です。の終了タグはTestData機能TestElementしません

<TestXML>
   <TestData attr1="MyAttr" attr2="1" DateAdded="">25</TestElement>
</TestXML>

そのはず

<TestXML>
   <TestData attr1="MyAttr" attr2="1" DateAdded="">25</TestData>
</TestXML>
于 2013-01-09T22:18:05.993 に答える
0

XMLテキストとして定義する必要があるため、valueプロパティは設定されていません。これを試して:

public class IntegerValue() {
  [XmlText]
  public int value {get; set;}
  [XmlAnyAttribute]
  public string[] XAttributes {get; set;}
}

属性装飾に文字列'Attribute'を含めないというac#規則に注意してください。それはそう

于 2013-01-09T23:17:52.150 に答える