C#麻烦循环遍历XML流中的元素

时间:2017-03-15 14:01:34

标签: c# xml stream

我有一个URL,在访问时输出XML,我想将XML作为流读取(我认为)并循环遍历元素以对数据执行某些操作,但是我得到了奇怪的结果。

到目前为止我的代码:

private void getFaxFinderLogs()
{
    WebRequest request = WebRequest.Create("https://faxfinder/ffws/v1/inbound_log");
    request.Credentials = new NetworkCredential(ffusername_tb.Text, ffpassword_tb.Text);

    using (WebResponse response = request.GetResponse())
    using (XmlReader reader = XmlReader.Create(response.GetResponseStream()))
    {
        var xdoc = XDocument.Load(reader);

        foreach (var el in xdoc.Elements())
        {
            debugTextBox1.Text = string.Format("Key={0},value={1}", el.Name, el.Value);
        }
    }
}

上面的URL中的XML产生了这种结构:

<?xml version="1.0" encoding="UTF-8" ?> 
<response>
    <message>Success</message> 
    <inbound_fax_entry>
        <filename>fax_inbound_20170313_133831_recv0943.pdf</filename> 
        <status>complete</status> 
        <complete_time>2017-03-13T17:38:31</complete_time> 
        <remote_id>5551239999</remote_id> 
        <pages>2</pages> 
        <extension>3555</extension> 
        <recipient_name>Customer Service</recipient_name> 
        <channel>8</channel> 
        <delivered_to>
            <type>Share</type> 
            <destination>//fileserver/share/fax_inbound_20170313_133831_recv0943.pdf</destination> 
        </delivered_to>
        <delivered_to>
            <type>Print</type> 
            <destination>LOCAL DESTINATION</destination> 
        </delivered_to>
        <location /> 
        <caller_name>NAME OF THE CALLER</caller_name> 
        <caller_number>5551239999</caller_number> 
    </inbound_fax_entry>
    <inbound_fax_entry>
    ...
    </inbound_fax_entry>
</response>

上面提到的代码在debugTextBox1控件中生成以下输出:

Key=response,value=
  Success

  fax_inbound_20170313_133831_recv0943.pdf
  complete
  2017-03-15T13:31:06
  5551239999
  12
  3555
  Customer Service
  ...

我可以看到它只是识别第一个键response,然后剥离所有其他键并显示值。老实说,我不需要关键名称,我的最终目标是进行精简分析(计算我们收到的传真数量,识别错误等),然后将数据转换为可导出的CSV。如果我可以让它枚举每个inbound_fax_entry密钥对之间的所有内容,我可以轻松地删除我想要的数据。

任何建议都将不胜感激。

编辑我正在思考它,我确实需要键名以及相应的值;并非每个传真都填充了所有XML元素,因此我需要查找inbound_fax_entry来描述我的csv中的新行,然后记录每个元素的值,即使没有数据。

1 个答案:

答案 0 :(得分:0)

我相信你的debugTextBox1行需要读取el.Key而不是el.Name。

否则,您可以尝试:

foreach (var el in xdoc.Elements())
        {
           debugTextBox1.Text = string.Format("Key={0},value={1}", el.Attributes["key"].Value.ToString(), el.Attributes["value"].Value.ToString());
        }

此问题类似于How to read key/value in xml file,其答案可能会有所帮助。