0

ボタンクリックイベントがあります:

private void button1_Click(object sender, EventArgs e)
        {

            string fileName = @"d:\adilipman1937067724.xml";
            ParseAndDisplayXml(fileName);
        }

そして機能:

private void ParseAndDisplayXml(string filename)
        {
            XDocument document = XDocument.Load(filename);
            var list = document.Root.Elements("Message")
                .Select(
                e => new
                {
                    Date = e.Attribute("Date").ToString(),
                    Time = e.Attribute("Time").ToString(),
                    Text = e.Attribute("Text").ToString()
                }
                );
 string result="";
            foreach (var item in list)
            {
               result += string.Format("Date--{0},Time--{1},Text--{2}", item.Date, item.Time, item.Text);


            }
textBox1.Text = result;
        }

日付と時刻の結果は問題ありませんが、テキストの結果は間違っています。これは Text: hello の結果です。Text で取得する必要があるのは hello だけです。 Date と Time の結果は、Date="31/01/2012" and Time="10:15:42" です。

問題はテキストを取得することです。

次に、プログラムを実行しているときに textBox1 に入るのは混乱です:

Date--Date="31/01/2012",Time--Time="10:15:42",Text--date--Date="31/01/2012",Time--Time="10: 15:55",Text--日付--日付="31/01/2012",時刻--時刻="10:15:58",文字--日付--日付הבא ?Date--Date="31/01/2012",Time--Time="10:16:27",Text--1000 から 1000 に更新されました 1000 よりも早く ככיart倍256מספרמספרמספרמספרלא?日付 - デート= "31/01/2012"、時刻= "10:17:03"、テキスト - לחשבממממ-1000ערכ1000ערכ1000ערכ1000גבגב耳松ם耳生/01/2012",Time--Time="10:17:10",Text--ז"א בפריםDate--Date="31/01/2012",Time--Time="10:17:14" ,Text--לא בהיסטוגרמהDate--Date="31/01/2012",Time--Time="10:17:20",Text--בעזרת ההיסטוגרמהDate--Date="

たとえば、元の 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>
</Log>
4

1 に答える 1

1

これは、指定したXMLファイルでは、が属性Textはなく、の子タグであるためです。Message

あなたがする必要があるのは、あなたが望む子ノードを選択し(例えば、node.SelectNodesまたはを使用してnode.SelectSingleNode)、それからそのテキスト値(node.InnerText)を取得することです。

textBox1の混乱については、各行の後に追加する必要があります\r\nstring.Format("...\r\n", ...


では、XMLファイルを見てみましょう。必要に応じて、XMLファイルの基本を理解しattributeselementsそのXMLファイルが構成されていることを理解するために読んでください。

したがって、ファイルには、 DateTimeDateTimeSessionIDMessageを持つ要素がありattributesます。次に、この要素には子ノード:、、があり、最初の2つには属性がなく、3番目の要素にはStyle属性と内部テキスト(とタグの間のすべて)があります。MessageFromToText<Text></Text>

XmlNodeクラスの使用方法は次のとおりです。

XmlDocument xml = new XmlDocument()
xml.Load("path_to_xml_file");

ここでは、xmlファイル全体をオブジェクトにロードしました。これで、特定のノードを選択できます。

XmlNodeList messages = xml.SelectNodes("/root/Message");

"/root/Message"一部はですXPath、あなたはそれについて読みたいかもしれません、それはかなり役に立ちます...

これで、ファイル内のすべてのMessageノードがリストに含まれますmessages。私たちはそれを繰り返すことができます:

foreach (XmlNode message in messages)
  { ... }

各ノードについて、その属性を取得できます。

#msg is a XmlNode from messages list
#XmlNode.Attributes is a list of all attributes in given node
XmlNode dateAttribute = msg.Attributes.GetNamedItem("Date");

属性がXmlNode自体であることに注意してください。ノードにそのような属性がなかった場合はdateAttribute == null、そうでない場合は、その値にを介してアクセスできますdateAttribute.Value。私は通常これのために補助機能を作ります:

public static string GetStringAttribute(XmlNode node, string name, string defaultValue="")
    {
        XmlNode attrNode = node.Attributes.GetNamedItem(name);
        if (attrNode == null)
            return defaultValue;
        else
            return attrNode.Value.Trim();
    }

また、Messageノードから、そのText部分を抽出できます。

XmlNode textNode = msg.SelectSingleNode("Text");
string textBetweenTags = textNode.InnerText;

XPathXMLファイルがどのように構築されているか、何がどのように使用されているかを理解するために、これで少し明確になることを願っています。W3Schoolをお勧めします。

すべてのコードを修正するわけではありませんが、それを使用し、\r\n各行を追加した後に配置することを忘れないでください。必要な出力が得られるはずです。頑張ってください。

于 2012-08-23T12:28:47.317 に答える