如何解析xml数据?

Posted

技术标签:

【中文标题】如何解析xml数据?【英文标题】:How to parse xml data? 【发布时间】:2017-12-15 08:19:21 【问题描述】:

我有一个 WPF 项目,通过数据集将我的数据网格绑定到 xml,如下所示:

XAML:

<DataGrid Name="dgConfig" AutoGenerateColumns="False" ItemsSource="Binding ModulesView" >
    <DataGrid.Columns>
         <DataGridTextColumn Header="ModelNumber" Binding="Binding ModelNumber" IsReadOnly="True"  />
         <DataGridTextColumn Header="ParamName" Binding="Binding ParamName" IsReadOnly="True"/>
         <DataGridTextColumn Header="ParamValue" Binding="Binding ParamValues, Mode=TwoWay" />
         <DataGridTextColumn Header="DefaultValue" Binding="Binding DefaultValue" IsReadOnly="True"/>
         <DataGridTextColumn Header="Address" Binding="Binding Address" IsReadOnly="True"/>
         <DataGridTextColumn Header="LowHigh" Binding="Binding LowHigh" IsReadOnly="True"/>
    </DataGrid.Columns>
</DataGrid>

视图模型:

    public ICollectionView ModulesView
    
        get
        
            if (_ModulesView == null)
                RefreshModule();
            return _ModulesView;
        
        set
        
            _ModulesView = value;
            NotifyPropertyChanged();
        
    

    private void RefreshModule()
    
        ModulesView = new ListCollectionView(sdb.GetModules())
        
            Filter = obj =>
            
                var modules = (Module)obj;
                return SelectedProduct != null && Product.ModelNumber == SelectedProduct.ModelNumber;
            
        ;
    

XML:

  <Modules>
     <ModelNumber>1</ModelNumber>
     <ParamName>I00-I07 Logic</ParamName>
     <ParamValue>1</ParamValue>
     <DefaultValue>1</DefaultValue>
     <Address>41301</Address>
     <LowHigh>0</LowHigh>
 </Modules>
 <Modules>
     <ModelNumber>1</ModelNumber>
     <ParamName>I10-I17 Logic</ParamName>
     <ParamValue>10</ParamValue>
     <DefaultValue>10</DefaultValue>
     <Address>41301</Address>
     <LowHigh>1</LowHigh>
 </Modules>

数据集:

    public ObservableCollection<Module> GetModules()
    
        DataSet ds = StoreDbDataSet.ReadDataSet();
        ObservableCollection<Module> modules = new ObservableCollection<Module>();
        foreach (DataRow moduleRow in ds.Tables["Modules"].Rows)
        
            modules.Add(new Module((UInt16)moduleRow["ModelNumber"], moduleRow["ParamName"].ToString(),
                    (UInt16)moduleRow["ParamValue"], (UInt16)moduleRow["DefaultValue"],(UInt16)moduleRow["Address"],
                    (Boolean)moduleRow["LowHigh"]));
        
        return modules;
    

现在我面临新的问题,我必须通过AddressLowHigh来解析xml数据,例如:Address 41301是一个ushort类型,我必须将其解析为 8 位(LowHigh == 0 表示低字节 LowHigh == 1 表示高字节),我想向数据网格显示每一个位数据,我花了几天时间但没有任何想法,请告诉我该怎么做?如有任何建议,我将不胜感激。非常感谢!

【问题讨论】:

在我看来,您已经在通过数据集读取 XML,那么确切的问题是什么?根据 LowHigh 将 UInt16 转换为字节?如果是这样,最简单的方法是在进行转换的 Module 类上拥有另一个属性,并绑定到该属性。 原谅我的模棱两可的表达,以前在datagrid中有一个ParamValue绑定到dataset,现在我想通过将UInt16转换为byte,在datagrid中有8列ParamValue 【参考方案1】:

好的,首先您可以使用BitConverter 或手动通过移位和转换,如here 将UInt16 转换为字节。

然后您可以使用BitArray 将一个字节转换为单个位(如果这是您需要的),或者通过移位再次手动。

如果您想要 8 列,每列显示一个单独的位,则将 8 个只读属性添加到执行此操作的 Module 类,每个输出一个单独的位,并将它们中的每一个绑定到一列。

如果我误解了这个问题,请告诉我,我会尝试进一步澄清。

【讨论】:

以上是关于如何解析xml数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何解析xml数据?

如何从 xml 解析器中读取数据

php如何解析多级xml报文?

如何解析iOS中具有特殊字符的xml数据?

如何解析 XML 中的数据?

如何解析这个 XML 数据..?