2

XML ファイルがあります。

<root type="service">
  <Msg Date="03/23/2013 12:00:04 AM">Request'HANDSHAKE'</Msg>
  <Msg Date="03/23/2013 12:00:04 AM">Response'RSHANDSHAKE'</Msg>
  <Msg Date="03/23/2013 12:03:04 AM">Request'HANDSHAKE'</Msg>
  <Msg Date="03/23/2013 12:03:04 AM">Response'RSHANDSHAKE'</Msg>
  <Msg Date="03/23/2013 01:34:30 PM">Request 'IQ~bbabb3ff2-...DLE~VNECTRECVBDHANDLE'</Msg>
  <Msg Date="03/23/2013 01:34:30 PM">Response SIQ~7a23da12...RDHANDLE=O000000000014'</Msg>
</root>

ファイルを解析して、すべての要求の後に応答があるかどうかを確認する必要があります。応答がない場合は、エラーが発生したことを示します。C#、できれば LINQ でこれを行うにはどうすればよいですか?

4

3 に答える 3

3

LINQ to XML などの XML パーサーを使用する必要があります。これにより、コードは次のようになります。

XDocument doc = XDocument.Load("file.xml");
bool isError = (from e1 in doc.Root.Elements()
                where e1.Value.StartsWith("Request")
                let e2 = e1.ElementsAfterSelf().FirstOrDefault()
                where e2 == null || !e2.Value.StartsWith("Response")
                select e1).Any();

この文学はあなたが求めたことを行います: すべてのRequest要素について、次の要素が存在し、要素であることを確認しますResponse

Response要素自体も有効でないなど、他の要件がある場合は、それに応じてコードを変更する必要があります。

于 2013-04-10T01:17:35.370 に答える
-1

このようなものはうまくいくでしょう、私はVisual Studioでそれをテストしました、確かにXPATHフィルター/セレクターを使ってこれの一部を行うためのよりエレガントな方法があります...

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml;

namespace ParseXML
{
    class Program
    {
        static void Main(string[] args)
        {
            String xmlString =
        @"<root type=""service"">
                <Msg Date=""03/23/2013 12:00:04 AM"">Request'HANDSHAKE'</Msg>
                <Msg Date=""03/23/2013 12:00:04 AM"">Response'RSHANDSHAKE'</Msg>
                <Msg Date=""03/23/2013 12:03:04 AM"">Request'HANDSHAKE'</Msg>
                <Msg Date=""03/23/2013 12:03:04 AM"">Response'RSHANDSHAKE'</Msg>
                <Msg Date=""03/23/2013 01:34:30 PM"">Request 'IQ~bbabb3ff2-...DLE~VNECTRECVBDHANDLE'</Msg>
                <Msg Date=""03/23/2013 01:34:30 PM"">Response SIQ~7a23da12...RDHANDLE=O000000000014'</Msg>
            </root>";

            // Create an XmlReader
            using (XmlReader reader = XmlReader.Create(new StringReader(xmlString)))
            {
                while (reader.ReadToFollowing("Msg"))
                {
                    string request = reader.ReadElementContentAsString();

                    if(reader.ReadToFollowing("Msg"))
                    {
                        string response = reader.ReadElementContentAsString();

                        if (request.Contains("Request") && response.Contains("Response"))
                        {
                            // Request/Response nodes identified...
                        }
                    }
                }
            }
        }
    }
}
于 2013-04-09T23:26:54.843 に答える