解析字符串 XML C# WPF

Posted

技术标签:

【中文标题】解析字符串 XML C# WPF【英文标题】:Parse String XML C# WPF 【发布时间】:2014-06-03 17:22:55 【问题描述】:

我知道这类问题已被问过很多次,但我没有找到任何可以解决我的问题的方法。这是我的场景,我从服务器 ftp 一个文件(一个 XML 文件)并将它作为一个字节数组接收,然后我将它解码成一个字符串......下面是我的代码。我现在想获取这个字符串并将其转换为 XML。我尝试了很多建议,例如使用 XDocument 的 Parse 方法和 XmlDocument 的 LoadXml ...见下文,但是当我钻入 XDocument 或 XmlDocument 对象时,我只看到两个节点。下面是我在转换字节数组后得到的 xml 示例。

我最终想在数据网格上显示这个 XML 文件,但是由于在将 xmls 字符串加载到 XDocument/XmlDocument 对象时我只得到了两个节点,我显然没有得到我需要的东西。

希望这是有道理的。顺便说一句,我对 WPF 比较陌生,所以如果这是一个新手问题,请原谅我。 :)

string xmlStr = Encoding.UTF8.GetString(FTP.DownLoadFile(remoteFile));

XDocument doc = XDocument.Parse(xmlStr);

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.LoadXml(xmlStr);

XML:

<?xml version="1.0" encoding="UTF-8"?>
<DataBaseUpdate version="CC03.11.003.5_v3">
    <inserttfsquery name="^-800*******" chargenumber="*********" length="0"
        translateddigits="866*******" objectclass="top|tfsquery" carrierid="0***"
        originatingdigits="*" expiration="" dialeddigits="800*******"
     />
<inserttfsquery name="^-855*******" chargenumber="*********" length="0"
        translateddigits="800*******" objectclass="top|tfsquery" carrierid="0***"
        originatingdigits="*" expiration="" dialeddigits="855*******"
     />

<inserttfsquery name="^-877*******" chargenumber="*********" length="0"
        translateddigits="877*******" objectclass="top|tfsquery" carrierid="0***"
        originatingdigits="*" expiration="" dialeddigits="877*******"
     />
</DataBaseUpdate>

更多信息: 解码 byte[] 后,我需要的 XML 在字符串中被正确捕获。此时我需要将字符串“转换”为某种 XMl 对象。一旦我有了 XML 对象,我想把它放在 DataSet/DataTable 中,这样我就可以将 ItemSource 设置为我视图中的 gridView,如下所示:

DataSet dataSet = new DataSet();
dataSet.ReadXml(new XmlTextReader(new StringReader(xmlStr)));
DataTable dt = new DataTable();
dt = dataSet.Tables[0];
FileContentDgv.ItemsSource = dt.DefaultView;

【问题讨论】:

如果你能包含实际的字符串,或者你所期望的解析的 XML,那就太好了。 WPF 是 UI(就像 WinForms 是 UI),所以不是正确的标签。这也应该用语言标记。 但那是两个节点。 【参考方案1】:

此解决方案可能会有所帮助。

使用 WPF DataGrid 和 System.XML 和 System.XML.Serialization 命名空间。

我保存了您提供的示例 XML 文件并将其加载为字节数组。然后我将 XML 反序列化为对象并使用 inserttfsquery 元素列表作为 DataGrid 的 ItemsSource,您不需要带有 WPF 的数据集/表。

这里是 XAML

<Window x:Class="WPFXMLTest.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow" Height="350" Width="525">
   <Grid>
        <DataGrid Name="dataGrid"/>
    </Grid>
</Window>

代码如下:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Xml;
using System.Xml.Serialization;

namespace WPFXMLTest 
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window 
        public MainWindow() 
            InitializeComponent();            
            DataBaseUpdate dbUpdate = DataBaseUpdate.FromXML(System.IO.File.ReadAllBytes(@"c:\temp\***.xml"));
            if (dbUpdate != null) 
                this.dataGrid.ItemsSource = dbUpdate.InsertTFSQueryList;
            
        
    

    [XmlRoot(ElementName="DataBaseUpdate")]
    public class DataBaseUpdate 

        public DataBaseUpdate() 

        

        public static DataBaseUpdate FromXML(byte[] xmlBytes) 
            DataBaseUpdate dbUpdate = null;
            using (MemoryStream ms = new MemoryStream(xmlBytes))                 
                XmlSerializer xs = new XmlSerializer(typeof(DataBaseUpdate));
                dbUpdate = xs.Deserialize(ms) as DataBaseUpdate;
            
            return dbUpdate;
        

        [XmlElement(ElementName="inserttfsquery")]        
        public List<InsertTFSQuery> InsertTFSQueryList  get; set; 

    

    public class InsertTFSQuery 

        public InsertTFSQuery() 

        

        [XmlAttribute(AttributeName = "name")]
        public string Name  get; set; 

        [XmlAttribute(AttributeName = "chargenumber")]
        public string Chargenumber  get; set; 

        [XmlAttribute(AttributeName = "length")]
        public string Length  get; set; 

        [XmlAttribute(AttributeName = "translateddigits")]
        public string Translateddigits  get; set; 

        [XmlAttribute(AttributeName = "objectclass")]
        public string Objectclass  get; set; 

        [XmlAttribute(AttributeName = "carrierid")]
        public string Carrierid  get; set; 

        [XmlAttribute(AttributeName = "originatingdigits")]
        public string Originatingdigits  get; set; 

        [XmlAttribute(AttributeName = "expiration")]
        public string Expiration  get; set; 

        [XmlAttribute(AttributeName = "dialeddigits")]
        public string Dialeddigits  get; set; 

    

【讨论】:

感谢 jiversion,您的方法比处理数据集/表要干净得多。我继续将我的实施更改为您的建议并且它有效。在我更改它之前,虽然我使用了这个 var ReportElements = new List(XDocument.Parse(XmlStr).Root.Elements("inserttfsquery")));然后我遍历集合并提取出我需要的值并将它们保存在数据表中。但是就像我说的那样,您的解决方案效果更好,而且更清洁。再次感谢!!

以上是关于解析字符串 XML C# WPF的主要内容,如果未能解决你的问题,请参考以下文章

C# 解析xml字符串

c#解析XML字符串

如何C#解析xml格式字符串

在 C# 中将 XML 字符串解析为类? [复制]

求C#解析XML字符串代码

C#合成解析XML与JSON