Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我正在尝试使用XDocument解析xml文件中的文本,但并非所有结果都如我所愿。为什么?_C# - Fatal编程技术网

C# 我正在尝试使用XDocument解析xml文件中的文本,但并非所有结果都如我所愿。为什么?

C# 我正在尝试使用XDocument解析xml文件中的文本,但并非所有结果都如我所愿。为什么?,c#,C#,我有一个按钮点击事件: private void button1_Click(object sender, EventArgs e) { string fileName = @"d:\adilipman1937067724.xml"; ParseAndDisplayXml(fileName); } 以及功能: private void ParseAndDisplayXml(string filename)

我有一个按钮点击事件:

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;
        }
日期和时间的结果是可以的,但文本的结果是错误的。 这是文本的结果: 你好 我只需要在文本中输入hello 日期和时间的结果为:Date=“31/01/2012”和Time=“10:15:42”

问题是如何获得文本

那么,当我运行程序时,我在文本框1中看到的是一团混乱:

2012年1月31/01/2012日,31/01/2012,31/01/01/2012、31/01/2012、31/01/2012、31/01/2012、时间——时间——时间——时间=“10:15:15:15:55)、31/01/2012、31/01/2012、日期——时间——时间——时间——时间——时间——时间——日期——时间——时间——时间——时间——时间——时间——时间——时间——从从从从从2014 2014方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方日期--Date=“2012年1月31日”,时间--Time=“10:15:58”,文本--Date--Date=“2012年1月31日”,时间--Time=“10:16:27”,文字——文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:文字:?הכוונה 1000 ערכים בפריים ? 本月14日的维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维日期--Date=“2012年1月31日”,时间--Time=“10:17:10”,文本--“日期--Date=“2012年1月31日”,时间--Time=“10:17:14”,文本--2012年1月31/01/2012年1月31日,2012年1月1日,时间——时间——时间=“10:17:17:20”时间——时间——时间——10:17:50)、文字——2012年1月31/01/2012年1月31/01/2012年1月31/01/2012 2012年1月31/01/2012年1月1月1 1日,文字——本方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方日期:日期:2012年1月31日,时间:时间:10:18:08“文本,文本——中,文本——1488比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对比对2009年9月上下周五的上下方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方日期--Date=“2012年1月31日”,时间--Time=“10:18:38”,文本—日期—日期=“2012年1月31日”,时间—时间=“10:18:45”,文本—日期—日期=“2012年1月31日”,时间—时间=“10:18:54”-- 例如,原始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>

היי
הייתה לי בעיה עם התוכנת ברקים אבל עכשיו הכל עובד.
מה השלב הבא ?
אמרת לי בזמנו לחשב ממוצע של 1000 ערכים ? הכוונה 1000 ערכים בפריים ? כי בפריים יש 256 מספרים לא ?

这是因为在您提供的XML文件中,
文本
不是属性,而是
消息
的子标记

您需要做的是选择所需的子节点(例如使用
node.SelectNodes
node.SelectSingleNode
),然后获取其文本值(
node.InnerText

对于文本框1中的混乱,您需要在每行(
string.Format(“…\r\n”,…
)之后添加
\r\n


好的,让我们看看你的XML文件:如果需要的话,你应该做一些阅读,以便基本了解“代码>属性和<代码>元素 XML文件由./P> 因此,您的文件:具有元素

Message
,该元素具有
属性
:Date、Time、DateTime和SessionID。接下来,此
Message
元素具有子节点:
From
To
Text
,其中两个元素第一个没有属性,而第三个元素具有Style属性和内部文本(介于
标记之间的所有内容

下面是如何使用
XmlNode
类:

XmlDocument xml = new XmlDocument()
xml.Load("path_to_xml_file");
在这里,我们将整个xml文件加载到一个对象。现在,我们可以选择特定的节点:

“/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();
    }
此外,我们还可以从
消息
节点提取其
文本
部分:

XmlNode textNode = msg.SelectSingleNode("Text");
string textBetweenTags = textNode.InnerText;
我希望这能澄清一些问题,以了解XML文件是如何构建的,XPath是什么,以及如何使用它


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

您能告诉我如何使用节点吗?请用我的代码选择节点?谢谢。我可能做得太快了,因为您使用XElement类。因此我认为
e.Ele注释(“文本”).ToString()
就足够了。我自己使用
XMLNode
类和
SelectNodes
SelectSingleNode
来解析XML文件,以获取元素-这些函数使用
xpath
在您正在处理的节点中查找所需的元素…事实上没有。元素没有这样做。然后告诉我如何使用XMLNode?谢谢s、 我确实扩展了我的答案,我希望这有帮助。
XmlNode textNode = msg.SelectSingleNode("Text");
string textBetweenTags = textNode.InnerText;