1

私はこの形式のXMLを持っています:

<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<Session>
<bIsImages>False</bIsImages>
<bIsPlayMedia>False</bIsPlayMedia>
<bIsSubject>False</bIsSubject>
<bIsVideo>False</bIsVideo>
<dtCreDate>2012-07-23</dtCreDate>
<dtSes_Date1>2001-01-01</dtSes_Date1>
<dtSes_Date2>2001-01-01</dtSes_Date2>
<dtSes_Date3>2001-01-01</dtSes_Date3>
<nClient_ID>32</nClient_ID>
<nDelay>32</nDelay>
<nImage_ID>32</nImage_ID>
<nOperator_ID>32</nOperator_ID>
<nSession_ID>32</nSession_ID>
<nVitality>32</nVitality>
<strDescr>qi stagnatie abq</strDescr>
<strMediaPath></strMediaPath>
<strName>qi stagnatie abq</strName>
<strPrimCause></strPrimCause>
<strSubjectPath>IDF_Eric duBosc.JPG</strSubjectPath>
</Session>
<SessionProgramData>
</SessionProgramData><SessionSubProgramData>
</SessionSubProgramData><SessionTuningData>
<SessionTuning>
    <SessionTuning_ID>332</SessionTuning_ID>
    <Session_ID>33</Session_ID>
    <Tuning>Brjesh</Tuning>
    <TuningDescr>Brijesh Desc</TuningDescr>
    <TuningIsNegative>false</TuningIsNegative>
    <TuningAddInfo>33</TuningAddInfo>
    <Amp>4.8</Amp>
    <Amp2 />
    <Amp3 />
    <Amp4 />
    <Amp5 />
    <Amp6 />
    <TunFreq>Brjesh</TunFreq>
    <TunFreq2 />
    <TunFreq3 />
    <TunFreq4 />
    <TunFreq5 />
    <TunFreq6 />
    <Revision2>false</Revision2>
    <Revision3>false</Revision3>
    <Revision4>false</Revision4>
    <Revision5>false</Revision5>
    <Revision6>false</Revision6>
    <AlreadyBalanced>false</AlreadyBalanced>
    <ImagePath>E:\Live Projects with Latest Source Code\SE-5\SE-5-Latest-04March11-Multilanguage-Chinese\SE-5\bin\Release\Images\</ImagePath>
    <Amp7 />
    <TunFreq7 />
    <Revision7>0</Revision7>
    <Description>Brijesh Note</Description>
    <TunRevDate>2013-02-20T18:08:48+05:30</TunRevDate>
    <TunRevDate2>2013-02-20T18:08:48+05:30</TunRevDate2>
    <TunRevDate3>2013-02-20T18:08:48+05:30</TunRevDate3>
    <TunRevDate4>2013-02-20T18:08:48+05:30</TunRevDate4>
    <TunRevDate5>2013-02-20T18:08:48+05:30</TunRevDate5>
    <TunRevDate6>2013-02-20T18:08:48+05:30</TunRevDate6>
    <TunRevDate7>2013-02-20T18:08:48+05:30</TunRevDate7>
    <Tuning_ID>20568</Tuning_ID>
</SessionTuning>
....So on
<SessionTuning>
    .....
    .....
</SessionTuning>

</SessionTuningData>
<Client>
<nClient_ID>32</nClient_ID>
<strAddress></strAddress>
<strCity></strCity>
<strCountry></strCountry>
<strFirstName>Eric</strFirstName>
<strImage>IDF_Eric duBosc.JPG</strImage>
<strLastName>Bosc</strLastName>
<strMI>du</strMI>
<strNote>ikke</strNote>
<strPhoneNum></strPhoneNum>
<strPostalCode></strPostalCode>
<strState></strState>
<strWorkPhone></strWorkPhone>
</Client>
<SE-5 />
</DocumentElement>

複数のSessionTuning場合、このXMLを文字列配列にインポートします。

私の既存のコード:

public static clsSessionTuningData[] GetSessionTuningFromXMLFile(string FileName)
        {
            try
            {

                StreamReader objReader = new StreamReader(FileName);
                string strData = objReader.ReadToEnd();
                objReader.Close();

                int nStart = 0, nEnd = 0;
                nStart = strData.IndexOf("<SessionTuningData>");
                nEnd = strData.IndexOf("</SessionTuningData>");
                if (nStart > 0 && nEnd > 0)
                {

                    nStart = nStart + "<SessionTuningData>".Length;
                    nEnd = nEnd + "</SessionTuningData>".Length;
                    strData = strData.Substring(nStart + 1, nEnd - nStart - 1);
                    string[] strSessionTuning = strData.Split('\r', '\n');
                    clsSessionTuningData[] objSessionTuning = new clsSessionTuningData[1];
                    clsDataType.XMLType objXML = new clsDataType.XMLType();

                    int j = 0;
                    for (int i = 0; i < strSessionTuning.GetLength(0); i++)
                    {
                        objXML = clsCommonFunc.GetXML(strSessionTuning[i]);

                        if (objXML != null)
                        {
                            switch (objXML.Name)
                            {
                                case "Revision2":
                                    objSessionTuning[j].bRevision2 = clsCommonFunc.IsYes(objXML.Value);
                                    break;
                                case "Revision3":
                                    objSessionTuning[j].bRevision3 = clsCommonFunc.IsYes(objXML.Value);
                                    break;
                                case "Revision4":
                                    objSessionTuning[j].bRevision4 = clsCommonFunc.IsYes(objXML.Value);
                                    break;
                                case "Revision5":
                                    objSessionTuning[j].bRevision5 = clsCommonFunc.IsYes(objXML.Value);
                                    break;
                                case "Revision6":
                                    objSessionTuning[j].bRevision6 = clsCommonFunc.IsYes(objXML.Value);
                                    break;
                                case "TuningIsNegative":
                                    objSessionTuning[j].bTuningIsNegative = clsCommonFunc.IsYes(objXML.Value);
                                    break;
                                case "Session_ID":
                                    objSessionTuning[j].nSession_ID = int.Parse(objXML.Value);
                                    break;
                                case "SessionTuning_ID":
                                    objSessionTuning[j] = new clsSessionTuningData();
                                    objSessionTuning[j].nSessionTuning_ID = int.Parse(objXML.Value);
                                    break;
                                case "TuningAddInfo":
                                    objSessionTuning[j].nTuningAddInfo = int.Parse(objXML.Value);
                                    break;
                                case "Amp":
                                    objSessionTuning[j].strAmp = objXML.Value;
                                    break;
                                case "Amp2":
                                    objSessionTuning[j].strAmp2 = objXML.Value;
                                    break;
                                case "Amp3":
                                    objSessionTuning[j].strAmp3 = objXML.Value;
                                    break;
                                case "Amp4":
                                    objSessionTuning[j].strAmp4 = objXML.Value;
                                    break;
                                case "Amp5":
                                    objSessionTuning[j].strAmp5 = objXML.Value;
                                    break;
                                case "Amp6":
                                    objSessionTuning[j].strAmp6 = objXML.Value;
                                    break;
                                case "TunFreq":
                                    objSessionTuning[j].strTunFreq = objXML.Value;
                                    break;
                                case "TunFreq2":
                                    objSessionTuning[j].strTunFreq2 = objXML.Value;
                                    break;
                                case "TunFreq3":
                                    objSessionTuning[j].strTunFreq3 = objXML.Value;
                                    break;
                                case "TunFreq4":
                                    objSessionTuning[j].strTunFreq4 = objXML.Value;
                                    break;
                                case "TunFreq5":
                                    objSessionTuning[j].strTunFreq5 = objXML.Value;
                                    break;
                                case "TunFreq6":
                                    objSessionTuning[j].strTunFreq6 = objXML.Value;
                                    break;
                                case "Tuning":
                                    objSessionTuning[j].strTuning = objXML.Value;
                                    break;

                                case "TuningDescr":
                                    objSessionTuning[j].strTuningDescr = objXML.Value;
                                    break;
                                case "AlreadyBalanced":
                                    objSessionTuning[j].bAlreadyBalanced = clsCommonFunc.IsYes(objXML.Value);
                                    break;
                                case "ImagePath":
                                    objSessionTuning[j].strImagePath = objXML.Value;
                                    break;
                                case "Amp7":
                                    objSessionTuning[j].strAmp7 = objXML.Value; // Krunal on 2-2-2012
                                    break;
                                case "TunFreq7":
                                    objSessionTuning[j].strTunFreq7 = objXML.Value;
                                    break;
                                case "Revision7":
                                    objSessionTuning[j].bRevision7 = clsCommonFunc.IsYes(objXML.Value);
                                    break;
                                case "Description":
                                    objSessionTuning[j].Description = objXML.Value;
                                    break;
                                case "TunRevDate":
                                    objSessionTuning[j].strRevDate = Convert.ToDateTime(objXML.Value);
                                    break;
                                case "TunRevDate2":
                                    objSessionTuning[j].strRevDate2 = Convert.ToDateTime(objXML.Value);
                                    break;
                                case "TunRevDate3":
                                    objSessionTuning[j].strRevDate3 = Convert.ToDateTime(objXML.Value);
                                    break;
                                case "TunRevDate4":
                                    objSessionTuning[j].strRevDate4 = Convert.ToDateTime(objXML.Value);
                                    break;
                                case "TunRevDate5":
                                    objSessionTuning[j].strRevDate5 = Convert.ToDateTime(objXML.Value);
                                    break;
                                case "TunRevDate6":
                                    objSessionTuning[j].strRevDate6 = Convert.ToDateTime(objXML.Value);
                                    break;
                                case "TunRevDate7":
                                    objSessionTuning[j].strRevDate7 = Convert.ToDateTime(objXML.Value);
                                    break;
                                case "Tuning_ID":
                                    objSessionTuning[j].nTuning_ID = int.Parse(objXML.Value);
                                    j++;//this is last field so increment by one,
                                    Array.Resize(ref objSessionTuning, j + 1);
                                    break;
                            }
                        }
                    }
                    return objSessionTuning;
                }
                return null;
            }
            catch (Exception ex)
            {
                clsErrorTrace.CreateLog("SessionTuning", ex);
                return null;
            }
        }

しかし、これは、Last属性がであることがわかっている場合に機能しますTuning_ID

これを使う簡単な方法はありますか..?

4

2 に答える 2

3

もちろん、これを行うにはもっと簡単な方法があります。それらの 1 つはSerializationと呼ばれ、クラス全体をある種のストリーム、つまり XML と Bytes に変換できます。XmlSerializerこれにはクラスを使用します。簡単な例を次に示します。

XML ファイルに格納するクラスがあるとします。

[Serializable] // you should mark the class as serializable
public class MyData
{
    public int Value { get; set; }
    public string Name { get; set; }
    public string[] SubItems { get; set; }
}

このコードは、それを XML ファイルに変換します。

MyData data = new MyData();
data.Name = "TestName";
data.Value = 100;
data.SubItems = new string[] {"Item1", "Item2", "Item3"};
XmlSerializer ser = new XmlSerializer(typeof(MyData));
using (FileStream file = new FileStream(fileName, FileMode.Create, FileAccess.Write))
{
    ser.Serialize(file, data);
}

結果のファイルは次のとおりです。

<?xml version="1.0"?>
<MyData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Value>100</Value>
  <Name>TestName</Name>
  <SubItems>
    <string>Item1</string>
    <string>Item2</string>
    <string>Item3</string>
  </SubItems>
</MyData>

ファイルを読み取るには、次のDeserializeメソッドを使用します。

using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
{
    ser.Deserialize(file, data);
}

もう 1 つのオプションは、.NET フレームワークの特殊なクラスの 1 つを使用して XML ファイルを読み取ることです。

XDocument doc = XDocument.Load(fileName);
List<clsSessionTuningData> objSessionTuning = new List<clsSessionTuningData>()
foreach (var session in doc.Descendants("SessionTuningData"))
{
    XElement elem;
    clsSessionTuningData data = new clsSessionTuningData();
    elem = session.Element("Revision2");
    if (elem != null)
        data.bRevision2 = elem.Value;

    // and so on...
}
于 2013-02-27T13:43:06.183 に答える
0

あなたは出来る:

1) XML をXMLDocumentにロードし、そのプロパティ (主にChildNodes ) を介してドキュメントをナビゲートします。

2) XML を XMLDocument にロードし、XPathを使用してドキュメントをクエリし、 CreateNavigatorを介してナビゲーターを作成します。

3) ドキュメントをXmlReaderで解析します。

4) Xml スキーマに密接に関連する一連のクラスを作成し、XmlDeserializerを使用してファイルを一連のオブジェクトにマップします (これは素晴らしいことですが、XmlDeserializer は構成が少し頑固なため、セットアップが難しい場合があります)。

すべてのデータが必要な場合は、オプション (4) を選択し、変換を容易にするために XML/モデル クラスを再設計する可能性があります。

いくつかの値が必要な場合は、コードがほとんど必要ないため、おそらく (2) を使用します。ここで (2) の例をいくつか参照してください。

于 2013-02-27T13:40:00.703 に答える