2017-04-21 43 views
0

我如何反序列化下面的XML转换成C#类复杂的XML反序列化到C#类

<Transaction ControlNumber="0001"> 
    <ST> 
     <ST01>271</ST01> 
    </ST> 
    <BHT> 
     <BHT01>022</BHT01> 
    </BHT> 
    <HierarchicalLoop LoopId="2000A" LoopName="Information Source Level" Id="1" ParentId=""></HierarchicalLoop> 
    <HierarchicalLoop LoopId="2000A" LoopName="Information Source Level" Id="2" ParentId=""></HierarchicalLoop> 
    <HierarchicalLoop LoopId="2000A" LoopName="Information Source Level" Id="3" ParentId=""></HierarchicalLoop> 
</Transaction> 

我知道,如果HierarchicalLoop节点被包裹在一个HierarchicalLoops节点这将是容易的,但因为我已经别无选择不允许更改XML格式。我正在寻求关于Transaction中包含的HierarchicalLoop节点的指导,其中Transaction也有其他不同的子节点!我还使用C#中的XmlSerializer类来解析XML。谢谢!

+0

1.将XML文本不作为图像。 2.这个XML格式不正确:标签没有关闭。发布格式良好的xml! –

+0

@AlexanderPetrov,我的不好。我已经编辑了这个问题。 – user2278488

回答

1

我已经得到了这个,现在已经解决了。我想这是一个有点愚蠢的问题。

public class Transaction 
{ 
    [XmlAttribute("ControlNumber")] 
    public string ControlNumber { get; set; } 

    public ST ST { get; set; } 

    public BHT BHT { get; set; } 

    [XmlElement("HierarchicalLoop")] 
    public List<HierarchicalLoop> HierarchicalLoops { get; set; } 
} 
+0

是的,工作很好。 –

0

创建一组类:

public class Transaction 
{ 
    public ST ST { get; set; } 
    public BHT BHT { get; set; } 
    [XmlElement] 
    public List<HierarchicalLoop> HierarchicalLoop { get; set; } // maybe HierarchicalLoop[] 
    [XmlAttribute] 
    public string ControlNumber { get; set; } // maybe int 
} 
public class ST 
{ 
    public string ST01 { get; set; } // maybe int 
} 

public class BHT 
{ 
    public string BHT01 { get; set; } // maybe int 
} 

public class HierarchicalLoop 
{ 
    [XmlAttribute] 
    public string LoopId { get; set; } 
    [XmlAttribute] 
    public string LoopName { get; set; } 
    [XmlAttribute] 
    public string Id { get; set; } // maybe int 
    [XmlAttribute] 
    public string ParentId { get; set; } 
} 

实例:

Transaction transaction; 
var xs = new XmlSerializer(typeof(Transaction)); 

using (var fs = new FileStream("in.xml", FileMode.Open)) 
    transaction = (Transaction)xs.Deserialize(fs); 

using (var fs = new FileStream("out.xml", FileMode.Create)) 
    xs.Serialize(fs, transaction);