<tradingPartner ParticipantType="Distributor"> 200408144 Union Gas Ltd <tradingPartner"> <tradingPartner ParticipantType="Distributor"> 200408144 Union Gas Ltd <tradingPartner"> <tradingPartner ParticipantType="Distributor"> 200408144 Union Gas Ltd <tradingPartner" />

XMLからC#に変換できません

<?xml version="1.0" encoding="utf-8" standalone="yes"?>    <tradingPartnerDirectory>

  <tradingPartner ParticipantType="Distributor">
    200408144
    Union Gas Ltd
  


  <tradingPartner ParticipantType="Retailer">
    DUNS24653
    Local Authority Services Limited
  
      
SA1854
GASAMO #1 EDA-ABC
24
11/1/2011
11/1/2011
EDA
546
37.51

  10109251120297
  TOWN OF DESERONTO
  01
  C
  
    JAN
    2011
    1116.0040
    1.045723
  
  
    FEB
    2011
    1269.7390
    0.937073
  
  
    MAR
    2011
    2064.0370
    1.015836
  
  
    APR
    2011
    82.5610
    0.982911
  
  
    MAY
    2011
    546.6140
    0.972752
  
  
    JUN
    2011
    128.1130
    1
  
  
    JUL
    2011
    5.6940
    1
  
  
    AUG
    2011
    0
    1
  
  
    SEP
    2010
    0
    1
  
  
    OCT
    2010
    2.8470
    0.993534
  
  
    NOV
    2010
    290.3890
    1.0585
  
  
    DEC
    2010
    686.1140
    0.938379
  


  10110651120442
  COMMUNITY CENTRE
  01
  C
  
    JAN
    2011
    4327.3610
    1.045723
  
  
    FEB
    2011
    4811.3420
    0.937073
  
  
    MAR
    2011
    5924.4990
    1.015836
  
  
    APR
    2011
    4971.9730
    0.982911
  
  
    MAY
    2011
    2302.5290
    0.972752
  
  
    JUN
    2011
    761.1410
    1
  
  
    JUL
    2011
    350.3160
    1
  
  
    AUG
    2011
    267.5140
    1
  
  
    SEP
    2010
    42.7050
    1
  
  
    OCT
    2010
    416.8490
    0.993534
    0.993534
  
  
    NOV
    2010
    1389.3110
    1.0585
  
  
    DEC
    2010
    1641.4940
    0.938379
  
  

私のXMLコードです..私はそれを変換することはできません私はそのXMLのために作成されたC#のクラスです下のC#のクラス

public class DPDocument
{
    public TradingPartnerDirectory tradingpartnerdirectory
    {
        get;
        set;
    }

    public ContractInformation contractInformation
    {
        get;
        set;
    }

    public DPDocument()
    {
        tradingpartnerdirectory = new TradingPartnerDirectory();
        contractInformation = new ContractInformation();
    }
}

public class TradingPartnerDirectory
{
    public Sender sender
    {
        get;
        set;
    }

    public Recipient recipient
    {
        get;
        set;
    }

    public TradingPartnerDirectory()
    {
        sender = new Sender();
        recipient = new Recipient();
    }
}

public class Sender
{
    public TradingPartner tradingPartner
    {
        get;
        set;
    }

    public Sender()
    {
        tradingPartner = new TradingPartner();
    }
}

public class Recipient
{
    public TradingPartner tradingPartner
    {
        get;
        set;
    }

    public Recipient()
    {
        tradingPartner = new TradingPartner();
    }
}

public class TradingPartner
{
    [XmlAttribute("ParticipantType")]
    public string ParticipantType
    {
        get;
        set;
    }

    public long CompanyID
    {
        get;
        set;
    }

    public string CompanyName
    {
        get;
        set;
    }
}

public class ContractInformation
{
    public string ContractID
    {
        get;
        set;
    }

    public string ContractName
    {
        get;
        set;
    }

    public int Amendment
    {
        get;
        set;
    }

    public DateTime FirstDeliveryDate
    {
        get;
        set;
    }

    public DateTime EffectiveDate
    {
        get;
        set;
    }

    public string DeliveryArea
    {
        get;
        set;
    }

    public int TotalDCQ
    {
        get;
        set;
    }

    public decimal EnergyFactor
    {
        get;
        set;
    }

    public List child
    {
        get;
        set;
    }

    public ContractInformation()
    {
        child = new List();
    }
}

public class EndUseLocationInformation
{
    public long AccountNumber
    {
        get;
        set;
    }

    public string AccountName
    {
        get;
        set;
    }

    public int RateClass
    {
        get;
        set;
    }

    public string ServiceClass
    {
        get;
        set;
    }

    public List childchild
    {
        get;
        set;
    }

    public EndUseLocationInformation()
    {
        childchild = new List();
    }
}

public class ForecastInformation
{
    public string BillingMonth
    {
        get;
        set;
    }

    public int BillingYear
    {
        get;
        set;
    }
    public decimal Consumption
    {
        get;
        set;
    }

    public decimal WeatherFactor
    {
        get;
        set;
    }

    public ForecastInformation()
    {

    }
}

私はそれを1回のショットでC#DPDocumentオブジェクトに変換することはできません。私はすべての方法で試しましたが、私はそれを達成できません。 最後に私は個々のノードリストを取ってそのようなリストを処理するような最悪の解決策に行きました。私は私のprobを解決するためにエレガントなソリューションが必要です。 前もって感謝します :)

0

2 答え

有効なXML文書がある場合は、2段階の処理を実行できます。

  1. run the xsd.exe command line tool that gets installed with the .NET framework to convert your xml into a XSD (XML schema):

    c:\> xsd.exe yourfile.xml
    

    This will create a file called yourfile.xsd in the same location which you'll need for the second step.

  2. run the xsd.exe command line tool again, converting your xml schema into C# code:

    c:\> xsd.exe /c yourfile.xsd 
    

    This will create a file called yourfile.cs in the same location that contains the C# classes and helper structures that you need to deserialize this particular xml you're dealing with.

さて、そのC#ファイルで、あなたはできるはずです:

XmlSerializer serializer = new XmlSerializer(typeof(DPDocument));
TextReader tr = new StreamReader(@"path-to-your-XML-file-here"); 
var result = serializer.Deserialize(tr);

XMLファイルから直列化された DPDocument クラスを取得する必要があります。

この具体的なケースでは、これをしようとすると、XML入力ファイルに基づいて XSD ツールが優れているが完璧ではないジョブを実行するため、エラーが発生します。手動でこれを修正する必要があります:

public partial class DPDocumentTradingPartnerDirectory {
  private TradingPartner[][] senderField;
  private TradingPartner[][] recipientField;

XMLから推測されるXSDは、ここに配列の配列を持つ可能性があります。実際にはこれは実際にはないと思います(その特定のXMLはわかりません - それは私の前提です)。そうした場合、配列の「1つのレベル」しか持たないので、手動でこれを行う:

public partial class DPDocumentTradingPartnerDirectory {
  private TradingPartner[] senderField;
  private TradingPartner[] recipientField;

しかし、いったんこれを行うと、デシリアライゼーションは完璧に機能し、XMLファイルをC#に変換することはほとんどありません。

2
追加された
@ sq33G:どのように? XSDツールはXML-> XSDとXSD-> CSで動作しますが、XMLからC#に直接移行することはできません。これをすべて手作業でやっているのはちょっと面倒で時間がかかることです。
追加された 著者 marc_s,
@Ramakrishna:まあ、どうなりますか?エラーの場合:原因にエラーがありますか?
追加された 著者 marc_s,
私はTextReaderを試してみましたtr = null; XmlSerializer serializer2 = null; DPDocument dpDocument = null; serializer2 =新しいXmlSerializer(typeof(DPDocument)、 "DPDocument"); tr =新しいStreamReader(@ "E:\ Consumption_Forecast_SA1854_24 - Copy.xml"); dpDocument =(DPDocument)serializer2.Deserialize(tr);しかし、私は変換することができません。
追加された 著者 Ramakrishna,
なぜXMLからC#にまっすぐ行くのですか? (実際には、私はこれについていくつかの答えを考えることができますが、私はあなたの考えが何であるか不思議でした)
追加された 著者 sq33G,
ええ、私の悪い。もっと慎重に MSDN のドキュメントを読む。
追加された 著者 sq33G,

それを試してください:NOT VALID XML;)開始と終了をチェックすると、すべてのタグが閉じないわけではありません。

1
追加された
もしあなたが何かタグが閉じられていないのを見つけたら、それは私の間違いですが、私のXMLファイルはそのようにしか見えません。あなたが私にあなたに貴重なソリューションを与える1つのPLZを変換する任意のアイデアを持っている場合はありがとう:)
追加された 著者 Ramakrishna,
うん タグは閉じられていません。
追加された 著者 Strelok,
唯一のものではありません;)実際にはもっとあります。このように、標準的なXMLメカニズムを通じてこの文書を処理する方法はありません。
追加された 著者 TomTom,