1

XMLファイルで動作するアプリケーションがあります。xmlファイルが存在する場合はうまく機能しますが、プロジェクトが空白のXMLファイルを生成し、出力ファイルが存在しない場合にそのファイルに書き込むという要件もあります。

xmlファイルには、次のような非常に複雑なスキーマがあります。

<?xml version="1.0" encoding="UTF-8"?>
<Results>
    <Result>
        <WorkorderId>45</WorkorderId>
        <WorkerId>13</WorkerId>
        <DeviceId>38954178</DeviceId>
        <Latitude>45.234</Latitude>
        <Longitude>19.54</Longitude>
        <Note>[all is good]</Note>
        <Operations>
            <Operation>
                <OperationId>23</OperationId>
                <Result>Success</Result>
                <ParsedInformation>
                    <Info>parsed data</Info>
                    <Info>more parsed data</Info>
                </ParsedInformation>
            </Operation>
            <!-- more operations ... -->
        </Operations>
    </Result>
    <!-- more results ... -->
</Results>

このようなXmlDocumentをどのように作成すれば、結果を書き込むことができるのでしょうか。プロジェクトのどこかにスキーマをハードコーディングすることなどに関する「ベストプラクティス」はありますか?

私はXmlを初めて使用するので、追加の情報/文献があれば大歓迎です。

4

3 に答える 3

3

私は通常、データを含むクラスのセットを作成し、適切なXmlSerializer属性でタグ付けして、期待する形式にシリアル化されるようにします。これはかなり良いリソースです:http://msdn.microsoft.com/en-us/library/2baksw0z (VS.85).aspx

あなたの場合、あなたは以下のクラスを持っているでしょう(テストされていない):

[XmlRoot("Results")]
public class Results
{
  List<Result> results = new List<Result>();

  [XmlElement("Result")]
  List<Result> Results {get{return results;}}
}

public class Result
{
  List<Operation> operations = new List<Operation>();
  int WorkorderId {get; set;}
  .... other fields
  string Note{get;set;}
  List<Operation> Operations {get{return operations;}}
}

public class Operation
{
  List<string> parsedInformation = new List<string>();
  int OperationId {get;set;}
  ....
  [XmlArray("ParsedInformation")]
  [XmlArrayItem("Info")]
  List<string> ParsedInformation{get{return parsedInformation;}}
}

後でXmlSerializerクラスを使用してxmlにシリアル化します。

XmlSerializer serializer = new XmlSerializer(typeof(Results));
StringBuilder sb = new StringBuilder(); //this will contain the xml
serializer.Serialize(new TextWriter(sb), resultsObj);

もちろん、データを文字列からオブジェクトに逆シリアル化することもできます。

xml用のXSDスキーマがある場合は、xsd.exeツールを使用してコードを生成できることに注意してください。

于 2009-07-28T08:41:26.227 に答える
1

ドキュメント形式のXMLスキーマが実際にある場合は、xsd.exeユーティリティを使用して、XmlSerializer互換性のある一連のクラスを生成できます。要素はクラスになり、属性と子はプロパティになり、要素シーケンスはコレクションになります。スキーマがそれらを定義している限り(つまり、にxs:intなるなど)、適切な型も取得しますint。次に、これらのクラスを使用してメモリ内にオブジェクトツリーを構築し、を使用してシリアル化できXmlSerializerます。

于 2009-07-28T08:26:36.193 に答える
0

私の知る限り、ノードごとにドキュメントを作成する必要があります。おそらく、空のツリーをテンプレートとして保存できます。

于 2009-07-28T08:19:18.533 に答える