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;
        }

日期和时间的结果是好的,但文本的结果是错误的。这是文本的结果:你好我需要在文本中得到的只是你好日期和时间的结果是:日期=“31/01/2012”和时间=“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--הייתה ליבעיה עם התוכנת ברקים אבל עכשיו הכל עובד.Date--Date="31/01/2012",Time--ה-ב-ב,Text הבא ?Date--Date="31/01/2012",Time--Time="10:16:27",Text--אמרת ליבזמנו לחשב ממוצע של 1000 ערכים ? הכוונה 1000 ערכים בפריים ? 256מספרמספרשששש? /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.SelectNodesor node.SelectSingleNode),然后获取它的文本值(node.InnerText)。

至于textBox1 里面乱七八糟的,需要\r\n在每一行后面加上 ( string.Format("...\r\n", ...)


好的,让我们看一下您的 XML 文件:如果需要,您应该阅读一些内容,以对 XML 文件的组成有基本的attributes了解elements

所以你的文件:有 element Message,其中有attributesDateTimeDateTimeSessionID。接下来,这个Message元素有子节点:和From,其中两个第一个没有属性,而第三个有Style属性和内部文本(和标签之间的所有内容。ToText<Text></Text>

以下是如何使用XmlNode类:

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

在这里,我们将整个 xml 文件加载到一个对象中。现在我们可以选择特定的节点:

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

"/root/Message"部分是 a 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;

我希望这能澄清一点,以了解 XML 文件是如何构建的、什么是XPath以及如何使用它,我推荐W3School

我不会更正你所有的代码,但是使用它并记住\r\n在添加每一行之后放置,你应该得到你想要的输出,祝你好运!

于 2012-08-23T12:28:47.317 回答