1

このコードでは、InnerText を使用して、タグなしで xml ファイルからのテキストのみを表示します。しかし、私は今、次の 2 つのことを変えたいと思っています。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string xmlString = @"d:\adilipman1937067724.xml";

            XmlDocument doc = new XmlDocument();
            doc.Load(xmlString);
            string t = doc.InnerText;
            textBox1.Text = t;
        }
    }
}
  1. テキストを行に解析します。

  2. 日付と時刻を解析して各行に追加します。

解析したいxmlファイルの例を次に示します。

FriendlyName="adilipman@yahoo.com"/></To><Text Style="font-family:Segoe UI; color:#000000; ">testing the test.</Text></Message><Message Date="31/01/2012" Time="10:15:58" DateTime="2012-01-31T08:15:58.897Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User 

「testing the test」というテキストのみを文字列に入れる代わりに、次のような textBox1 の形式にしたい:

adilipman 10:15:58 31/01/2012 testing the test      

これは線です。次の行は、たとえば次のようになります。

adilipman 10:15:59 31/01/2012 testing the test was ok 

しかし、今、textBox1 に入っているのは次のようなものです:

testing the test testing the test was ok 

xml ファイルからのその他のテキスト:

<?xml version="1.0"?>
<?xml-stylesheet type='text/xsl' href='MessageLog.xsl'?>
<Log FirstSessionID="1" LastSessionID="2"><Message Date="31/01/2012" Time="10:15:42" DateTime="2012-01-31T08:15:42.467Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User FriendlyName="adilipman@yahoo.com"/></To><Text Style="font-family:Segoe UI; color:#000000; ">היי</Text></Message><Message Date="31/01/2012" Time="10:15:55" DateTime="2012-01-31T08:15:55.097Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User FriendlyName="adilipman@yahoo.com"/></To><Text Style="font-family:Segoe UI; color:#000000; ">הייתה לי בעיה עם התוכנת ברקים אבל עכשיו הכל עובד.</Text></Message><Message Date="31/01/2012" Time="10:15:58" DateTime="2012-01-31T08:15:58.897Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User FriendlyName="adilipman@yahoo.com"/></To><Text Style="font-family:Segoe UI; color:#000000; ">מה השלב הבא ?</Text></Message><Message Date="31/01/2012" Time="10:16:27" DateTime="2012-01-31T08:16:27.775Z" SessionID="1"><From><User FriendlyName="Chocolade"/></From><To><User FriendlyName="adilipman@yahoo.com"/></To><Text Style="font-family:Segoe UI; color:#000000; ">אמרת לי בזמנו לחשב ממוצע של 1000 ערכים ? הכוונה 1000 ערכים בפריים ? כי בפריים יש 256 מספרים לא ?</Text></Message><Message Date="31/01/2012" Time="10:17:03" DateTime="2012-01-31T08:17:03.405Z" SessionID="1"><From><User FriendlyName="adilipman@yahoo.com"/></From><To><User FriendlyName="Chocolade"/></To><Text Style="font-family:Segoe UI; color:#000000; ">לחשב ממוצע של 1000 הערכים הגבוהים ביותר בהיסטוגרמה</Text></Message><Message Date="31/01/2012" Time="10:17:10" DateTime="2012-01-31T08:17:10.405Z" SessionID="1"><From><User FriendlyName="adilipman@yahoo.com"/></From><To><User FriendlyName="Chocolade"/></To><Text Style="font-family:Segoe UI; color:#000000; ">ז"א בפריים</Text></Message><Message Date="31/01/2012" Time="10:17:14" DateTime="2012-01-31T08:17:14.135Z" SessionID="1"><From><User FriendlyName="adilipman@yahoo.com"/></From><To><User FriendlyName="Chocolade"/></To><Text Style="font-family:Segoe UI; color:#000000; ">לא בהיסטוגרמה</Text></Message><Message Date="31/01/2012" Time="10:17:20" DateTime="2012-01-31T08:17:20.142Z" SessionID="1"><From><User 
4

1 に答える 1

0

xml ドキュメントを解析するにはさまざまな方法があります... XmlDocument, XmlTextReaders を使用しますが、既存の xml ドキュメントを解析するために Linq to xml クラスを使用することを好みますが、oun xml ドキュメントを作成して解析する必要がある場合は、使用することを好みますシリアル化。そのxmlドキュメントをどこで取ったのかわからないので、私は言っていますか??? 自分で作ったの???はいの場合は、xml シリアライゼーションを使用して独自のオブジェクトを xml に保存し、デシリアライゼーションを使用してそれらを読み戻す必要があります。xml ドキュメントを解析するよりもはるかに簡単です。

あなたの質問に似た最も簡単な例を次に示します。あなたのxmlの例から理解できるように...私はこのxmlフラグメントを使用しました:

<Message Date="31/01/2012" 
         Time="10:15:58" 
         DateTime="2012-01-31T08:15:58.897Z" 
         SessionID="1">
         <From>
               <User FriendlyName="Chocolade"/>
         </From>
         <To>
               <User FriendlyName="adilipman@yahoo.com"/>
         </To>
         <Text >testing the test.</Text>
</Message>

DateTime、SessionId、From、To、および Text フィールドを持つ Message クラスを作成する必要があります。何かのようなもの:

[Serializable]
public class User
{
      public string FriendlyName { get; set; }
}

[Serializable]
public class Message
{
      public string Text { get; set; }
      public DateTime DateTime { get; set; }
      public int SessionID { get; set; }
      public User Form { get; set; }
      public User To { get; set; }
}

[Serializable] 属性は、型 (メッセージ) をシリアル化できることをコンパイラが認識するために必要です。そして、クラスの xml 構造を作成した後、あなたのインスタンスMessageまたはそれらの eve 配列をシリアル化できますList<Message>。次に行う必要があります。

private void button1_Click(object sender, EventArgs e)
{
string xmlToSerializePath = @"c:/temp/stackowrflowquestionxml.xml";

XmlSerializer serializer = new XmlSerializer(typeof(Message));
StreamWriter writer = new StreamWriter(xmlToSerializePath);

Message messageToSerialize = new Message
                                    {
                                        DateTime = new DateTime(2012, 1, 31, 8, 15, 58),
                                        Form = new User()
                                                  {
                                                        FriendlyName = "Chocolade"
                                                  },
                                        To = new User
                                                  {
                                                        FriendlyName = "adilipman@yahoo.com"
                                                  },
                                        SessionID = 1,
                                        Text = "testing the test."
                                     };
       serializer.Serialize(writer, messageToSerialize);
       writer.Close();
}

次の xml ドキュメントを取得します。

<?xml version="1.0" encoding="utf-8"?>
<Message xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Text>testing the test.</Text>
  <DateTime>2012-01-31T08:15:58</DateTime>
  <SessionID>1</SessionID>
  <Form>
    <FriendlyName>Chocolade</FriendlyName>
  </Form>
  <To>
    <FriendlyName>adilipman@yahoo.com</FriendlyName>
  </To>
</Message>

それはあなたのものと非常に似ていますが、そのメッセージに関するすべての情報を取得する必要がある場合は、xml を渡す必要はありません。それを逆シリアル化し、独自のMessageクラスの正しいインスタンスを取得するだけです。

StreamReader reader = new StreamReader(xmlToSerializePath);
Message deserializedMessage = (Message)serializer.Deserialize(reader);
reader.Close();

メッセージのインスタンスを取得したら、好きなように操作して、そのテキストボックスにメッセージの情報を入力できます。

textBox1.Text = string.Format("{0} {1} {2} {3}", 
          deserializedMessage.DateTime, 
          deserializedMessage.Form.FriendlyName, 
          deserializedMessage.To.FriendlyName, 
          deserializedMessage.SessionID);

テキストボックスのテキストは次のようになります。

31.01.2012 8:15:58 Chocolade adilipman@yahoo.com 1

/ =============================================== ================================= /

そのような方法論を好まない、または使用したくない場合、またはサードパーソン xml によって既に作成されたものを解析する必要がある場合は、linq to xml 構文を使用できます。例えば:

XDocument インスタンスを作成します。

string xmlStringPath = @"d:/adilipman1937067724.xml";
XDocument document = new XDocument(xmlStringPath);

ただし、例外がスローされる場合があるため、XmlDocument を作成し、xml を文字列として読み込み、静的 XDocument メソッドを使用してその文字列を解析する必要があります。

XmlDocument doc = new XmlDocument();
doc.Load(xmlString);
XDocument document = XDocument.Parse(doc.OuterXml);

XDocument と XmlDocument に注意してください。これらは 2 つの異なるタイプです。次に、linq 構文を使用してドキュメントを解析できます。

// Get root message element
var messageElement = (from element in document.Elements()
                                  where element.Name == "Message"
                                  select element).FirstOrDefault();

// Get date attribute of message element
string date = messageElement.Attribute("Date").Value;

// Get To element
// Notice that we make select from elements of message element messageElement.Elements()
// You should closely follow about what attribute are you making select from,
// because your selection will return null, and you will get errors.
var toElement = (from element in messageElement.Elements()
                             where element.Name == "To"
                                select element).FirstOrDefault();

// Then we take value of user element friendly name attribute
// We get element (tag) User of all possible existing sub tags of tag To
string toFriendlyName =
                (from element in toElement.Elements()
                 where element.Name == "User"
                 select element.Attribute("FriendlyName").Value).FirstOrDefault();

すべての属性または要素についても同様です。ご覧のとおり、xml を「手作業で」解析するのは非常に困難で手間のかかる作業です。したがって、シリアル化を使用することをお勧めします。私の答えがお役に立てば幸いです。

于 2012-08-23T04:19:21.813 に答える