在C#中读取XML - 获取特定元素

时间:2015-12-16 21:43:15

标签: c# xml xmlreader

我正在阅读一些XML并将其显示在DataGridView中,效果很好。

然而,如果我能抓住特定元素并阅读其内容,我的生活将会轻松10倍。 (我正在使用XmlReader)

此外,是否有一种循环元素的简单方法?我需要抓住计数然后循环遍历每个“设施”,但我似乎无法使其正常工作。添加另一个“While(read)”并不是一个很好的解决方案。

此时我不想换到另一位读者,我现在正处于这个问题的深处。

XML数据:

    <data>
    <count>2</count>
    <facility>
        <typeId>1</typeId>
        <type>Beds</type>
        <quantity>0</quantity>
        <description>null</description>
    </facility>
    <facility>
        <typeId>2</typeId>
        <type>EDBeds</type>
        <quantity>0</quantity>
        <description>null</description>
    </facility>
</data>

代码:

while (xr.Read())
{
    if (xr.Name.Equals("count"))
    {
        valueName.Text = "We currently have " + xr.ReadElementContentAsString() + " facilities open.";
    }
    while (xr.ReadToFollowing("facility"))
    {
        //Add a new row for data if we are at a new Facility element
        if (xr.NodeType == XmlNodeType.Element && xr.Name == "facility")
        {
            row = generalData.Rows.Add();
            col = 0;
        }
        //Loop through current facility Element
    }
}

3 个答案:

答案 0 :(得分:2)

请参阅此post为什么您希望XDocument优先于XmlReader。因为它声明XDocument的API更容易并且支持'LINQ To XML'。 XmlReader已经过时,因为它已经过时并且包含错​​误。

var xml = @"
<data>
    <count>2</count>
    <facility>
        <typeId>1</typeId>
        <type>Beds</type>
        <quantity>0</quantity>
        <description>null</description>
    </facility>
    <facility>
        <typeId>2</typeId>
        <type>EDBeds</type>
        <quantity>0</quantity>
        <description>null</description>
    </facility>
</data>";

var xDocument = XDocument.Load( new StringReader( xml ) );
var facilityElements = xDocument.Descendants().Where( x => x.Name == "facility" );

// Count the elements
var count = facilityElements.Count();

foreach ( var facilityElement in facilityElements )
{
    // Handle elements
}

// Adds an facility element
var facility = new XElement( "facility" );
var typeId = new XElement( "typeId" );
typeId.SetValue(3);
facility.Add( typeId );
xDocument.Element( "data" ).Add( facility );

答案 1 :(得分:1)

对于给定的XML数据,我们不需要遍历每个设施&#39;在DataGridView上绑定数据的元素。

相反,我们可以按照以下简单步骤进行操作,

DataSet ds = new DataSet();
ds.ReadXml(xr);
dataGridView1.DataSource = ds.Tables["facility"];

- SJ

答案 2 :(得分:0)

使用“ReadSubTree()”跳出枪,效果很好:

                    XmlReader inner = xr.ReadSubtree();
                    while (inner.Read())
                    {
                        if (xr.NodeType == XmlNodeType.Text)
                        {
                             //Do stuff
                        }
                    }