繁体   English   中英

从C#访问XML数据

[英]Accessing XML data from C#

我正在努力从C#访问XML文件中存储的数据。 我读了很多帖子-最近的帖子在这里 -但仍然无法正常工作。

xml节点如下所示:

<Prop Name='StartTime' Type='Number' Flags='0x0'>
<Value>171.8032865</Value>
</Prop>

我需要知道名为“ StartTime”的属性的值是什么

编辑:上面的节点是xml文档中众多节点之一。 它嵌套在其他节点之间。 我需要找到名称为“ StartTime”的属性的所有值。

我使用XAML。

EDIT2:我认为如果显示更大的xml块(必须从中获取数据)会更好。 看来Kaz的解决方案是最接近所需解决方案的解决方案,但是如果我加载整个xml,它就会失败。

XML档案:

<Prop Type='TEResult' Flags='0x0'>
<Prop Name='TS' Type='Obj' Flags='0x0'>
    <Prop Name='SequenceCall' Type='Obj' Flags='0x0'>
        <Prop Name='ResultList' Type='Array' LBound='[0]' HBound='[3]' ElementType='Obj' Flags='0x0'>
            <ArrayElementPrototype Type='TEResult' Flags='0x0'>
            </ArrayElementPrototype>
            <Value ID='[0]'>
                <Prop Type='TEResult' Flags='0x0'>
                    <Prop Name='Error' Type='Obj' TypeName='Error' Flags='0x400000'>
                        <Prop Name='Code' Type='Number' Flags='0x400000'>
                            <Value>0</Value>
                        </Prop>
                        <Prop Name='Msg' Type='String' Flags='0x400000'>
                            <Value></Value>
                        </Prop>
                        <Prop Name='Occurred' Type='Boolean' Flags='0x400000'>
                            <Value>False</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Status' Type='String' Flags='0x400000'>
                        <Value>Failed</Value>
                    </Prop>
                    <Prop Name='Numeric' Type='Number' Flags='0x2400'>
                        <Value>0</Value>
                    </Prop>
                    <Prop Name='ReportText' Type='String' Flags='0x400000'>
                        <Value></Value>
                    </Prop>
                    <Prop Name='Common' Type='Obj' TypeName='CommonResults' Flags='0x0'>
                        <Prop Name='IncludeInReport' Type='Boolean' Flags='0x0'>
                            <Value>True</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='TS' Type='Obj' Flags='0x0'>
                        <Prop Name='StartTime' Type='Number' Flags='0x0'>
                            <Value>171.8032865</Value>
                        </Prop>
                        <Prop Name='TotalTime' Type='Number' Flags='0x0'>
                            <Value>0.0005158</Value>
                        </Prop>
                        <Prop Name='Index' Type='Number' Flags='0x0'>
                            <Value>0</Value>
                        </Prop>
                        <Prop Name='StepName' Type='String' Flags='0x0'>
                            <Value>Test 1</Value>
                        </Prop>
                        <Prop Name='StepGroup' Type='String' Flags='0x0'>
                            <Value>Main</Value>
                        </Prop>
                        <Prop Name='StepId' Type='String' Flags='0x0'>
                            <Value>ID#:TbZA+59stkivP1pqe//sUB</Value>
                        </Prop>
                        <Prop Name='Id' Type='Number' Flags='0x0'>
                            <Value>5</Value>
                        </Prop>
                        <Prop Name='StepType' Type='String' Flags='0x0'>
                            <Value>NumericLimitTest</Value>
                        </Prop>
                        <Prop Name='StepCausedSequenceFailure' Type='Boolean' Flags='0x0'>
                            <Value>True</Value>
                        </Prop>
                        <Prop Name='BlockLevel' Type='Number' Flags='0x0'>
                            <Value>0</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Limits' Type='Obj' Flags='0x3000'>
                        <Prop Name='Low' Type='Number' Flags='0x0'>
                            <Value>9</Value>
                        </Prop>
                        <Prop Name='High' Type='Number' Flags='0x0'>
                            <Value>11</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Comp' Type='String' Flags='0x3000'>
                        <Value>GELE</Value>
                    </Prop>
                </Prop>
            </Value>
            <Value ID='[1]'>
                <Prop Type='TEResult' Flags='0x0'>
                    <Prop Name='Error' Type='Obj' TypeName='Error' Flags='0x400000'>
                        <Prop Name='Code' Type='Number' Flags='0x400000'>
                            <Value>0</Value>
                        </Prop>
                        <Prop Name='Msg' Type='String' Flags='0x400000'>
                            <Value></Value>
                        </Prop>
                        <Prop Name='Occurred' Type='Boolean' Flags='0x400000'>
                            <Value>False</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Status' Type='String' Flags='0x400000'>
                        <Value>Failed</Value>
                    </Prop>
                    <Prop Name='Numeric' Type='Number' Flags='0x2400'>
                        <Value>0</Value>
                    </Prop>
                    <Prop Name='ReportText' Type='String' Flags='0x400000'>
                        <Value></Value>
                    </Prop>
                    <Prop Name='Common' Type='Obj' TypeName='CommonResults' Flags='0x0'>
                        <Prop Name='IncludeInReport' Type='Boolean' Flags='0x0'>
                            <Value>True</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='TS' Type='Obj' Flags='0x0'>
                        <Prop Name='StartTime' Type='Number' Flags='0x0'>
                            <Value>171.8135159</Value>
                        </Prop>
                        <Prop Name='TotalTime' Type='Number' Flags='0x0'>
                            <Value>0.0000802</Value>
                        </Prop>
                        <Prop Name='Index' Type='Number' Flags='0x0'>
                            <Value>1</Value>
                        </Prop>
                        <Prop Name='StepName' Type='String' Flags='0x0'>
                            <Value>Test 2</Value>
                        </Prop>
                        <Prop Name='StepGroup' Type='String' Flags='0x0'>
                            <Value>Main</Value>
                        </Prop>
                        <Prop Name='StepId' Type='String' Flags='0x0'>
                            <Value>ID#:7RheSM0MDEGTAnRrrfGNcB</Value>
                        </Prop>
                        <Prop Name='Id' Type='Number' Flags='0x0'>
                            <Value>6</Value>
                        </Prop>
                        <Prop Name='StepType' Type='String' Flags='0x0'>
                            <Value>NumericLimitTest</Value>
                        </Prop>
                        <Prop Name='StepCausedSequenceFailure' Type='Boolean' Flags='0x0'>
                            <Value>False</Value>
                        </Prop>
                        <Prop Name='BlockLevel' Type='Number' Flags='0x0'>
                            <Value>0</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Limits' Type='Obj' Flags='0x3000'>
                        <Prop Name='Low' Type='Number' Flags='0x0'>
                            <Value>9</Value>
                        </Prop>
                        <Prop Name='High' Type='Number' Flags='0x0'>
                            <Value>11</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Comp' Type='String' Flags='0x3000'>
                        <Value>GELE</Value>
                    </Prop>
                </Prop>
            </Value>
            <Value ID='[2]'>
                <Prop Type='TEResult' Flags='0x0'>
                    <Prop Name='Error' Type='Obj' TypeName='Error' Flags='0x400000'>
                        <Prop Name='Code' Type='Number' Flags='0x400000'>
                            <Value>0</Value>
                        </Prop>
                        <Prop Name='Msg' Type='String' Flags='0x400000'>
                            <Value></Value>
                        </Prop>
                        <Prop Name='Occurred' Type='Boolean' Flags='0x400000'>
                            <Value>False</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Status' Type='String' Flags='0x400000'>
                        <Value>Failed</Value>
                    </Prop>
                    <Prop Name='Numeric' Type='Number' Flags='0x2400'>
                        <Value>0</Value>
                    </Prop>
                    <Prop Name='ReportText' Type='String' Flags='0x400000'>
                        <Value></Value>
                    </Prop>
                    <Prop Name='Common' Type='Obj' TypeName='CommonResults' Flags='0x0'>
                        <Prop Name='IncludeInReport' Type='Boolean' Flags='0x0'>
                            <Value>True</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='TS' Type='Obj' Flags='0x0'>
                        <Prop Name='StartTime' Type='Number' Flags='0x0'>
                            <Value>171.8240739</Value>
                        </Prop>
                        <Prop Name='TotalTime' Type='Number' Flags='0x0'>
                            <Value>0.000081</Value>
                        </Prop>
                        <Prop Name='Index' Type='Number' Flags='0x0'>
                            <Value>2</Value>
                        </Prop>
                        <Prop Name='StepName' Type='String' Flags='0x0'>
                            <Value>Test 3</Value>
                        </Prop>
                        <Prop Name='StepGroup' Type='String' Flags='0x0'>
                            <Value>Main</Value>
                        </Prop>
                        <Prop Name='StepId' Type='String' Flags='0x0'>
                            <Value>ID#:pWFWDejvo0GThcOYVssHBA</Value>
                        </Prop>
                        <Prop Name='Id' Type='Number' Flags='0x0'>
                            <Value>7</Value>
                        </Prop>
                        <Prop Name='StepType' Type='String' Flags='0x0'>
                            <Value>NumericLimitTest</Value>
                        </Prop>
                        <Prop Name='StepCausedSequenceFailure' Type='Boolean' Flags='0x0'>
                            <Value>False</Value>
                        </Prop>
                        <Prop Name='BlockLevel' Type='Number' Flags='0x0'>
                            <Value>0</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Limits' Type='Obj' Flags='0x3000'>
                        <Prop Name='Low' Type='Number' Flags='0x0'>
                            <Value>9</Value>
                        </Prop>
                        <Prop Name='High' Type='Number' Flags='0x0'>
                            <Value>11</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Comp' Type='String' Flags='0x3000'>
                        <Value>GELE</Value>
                    </Prop>
                </Prop>
            </Value>
            <Value ID='[3]'>
                <Prop Type='TEResult' Flags='0x0'>
                    <Prop Name='Error' Type='Obj' TypeName='Error' Flags='0x400000'>
                        <Prop Name='Code' Type='Number' Flags='0x400000'>
                            <Value>0</Value>
                        </Prop>
                        <Prop Name='Msg' Type='String' Flags='0x400000'>
                            <Value></Value>
                        </Prop>
                        <Prop Name='Occurred' Type='Boolean' Flags='0x400000'>
                            <Value>False</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Status' Type='String' Flags='0x400000'>
                        <Value>Failed</Value>
                    </Prop>
                    <Prop Name='Numeric' Type='Number' Flags='0x2400'>
                        <Value>0</Value>
                    </Prop>
                    <Prop Name='ReportText' Type='String' Flags='0x400000'>
                        <Value></Value>
                    </Prop>
                    <Prop Name='Common' Type='Obj' TypeName='CommonResults' Flags='0x0'>
                        <Prop Name='IncludeInReport' Type='Boolean' Flags='0x0'>
                            <Value>True</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='TS' Type='Obj' Flags='0x0'>
                        <Prop Name='StartTime' Type='Number' Flags='0x0'>
                            <Value>171.8270851</Value>
                        </Prop>
                        <Prop Name='TotalTime' Type='Number' Flags='0x0'>
                            <Value>0.0001041</Value>
                        </Prop>
                        <Prop Name='Index' Type='Number' Flags='0x0'>
                            <Value>3</Value>
                        </Prop>
                        <Prop Name='StepName' Type='String' Flags='0x0'>
                            <Value>Test 4</Value>
                        </Prop>
                        <Prop Name='StepGroup' Type='String' Flags='0x0'>
                            <Value>Main</Value>
                        </Prop>
                        <Prop Name='StepId' Type='String' Flags='0x0'>
                            <Value>ID#:w+ziJ/u2bkWz+F3kWa4mpC</Value>
                        </Prop>
                        <Prop Name='Id' Type='Number' Flags='0x0'>
                            <Value>8</Value>
                        </Prop>
                        <Prop Name='StepType' Type='String' Flags='0x0'>
                            <Value>NumericLimitTest</Value>
                        </Prop>
                        <Prop Name='StepCausedSequenceFailure' Type='Boolean' Flags='0x0'>
                            <Value>False</Value>
                        </Prop>
                        <Prop Name='BlockLevel' Type='Number' Flags='0x0'>
                            <Value>0</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Limits' Type='Obj' Flags='0x3000'>
                        <Prop Name='Low' Type='Number' Flags='0x0'>
                            <Value>9</Value>
                        </Prop>
                        <Prop Name='High' Type='Number' Flags='0x0'>
                            <Value>11</Value>
                        </Prop>
                    </Prop>
                    <Prop Name='Comp' Type='String' Flags='0x3000'>
                        <Value>GELE</Value>
                    </Prop>
                </Prop>
            </Value>
        </Prop>
        <Prop Name='SequenceFile' Type='String' Flags='0x0'>
            <Value>C:\Users\Public\Documents\National Instruments\TestStand 2010 SP1\Sequence File 16.seq</Value>
        </Prop>
        <Prop Name='Sequence' Type='String' Flags='0x0'>
            <Value>MainSequence</Value>
        </Prop>
        <Prop Name='Status' Type='String' Flags='0x0'>
            <Value>Failed</Value>
        </Prop>
    </Prop>
    <Prop Name='StartTime' Type='Number' Flags='0x0'>
        <Value>171.6948629</Value>
    </Prop>
    <Prop Name='TotalTime' Type='Number' Flags='0x0'>
        <Value>0.1359434</Value>
    </Prop>
    <Prop Name='ModuleTime' Type='Number' Flags='0x0'>
        <Value>0.1357157</Value>
    </Prop>
    <Prop Name='Index' Type='Number' Flags='0x0'>
        <Value>31</Value>
    </Prop>
    <Prop Name='StepName' Type='String' Flags='0x0'>
        <Value>MainSequence Callback</Value>
    </Prop>
    <Prop Name='StepGroup' Type='String' Flags='0x0'>
        <Value>Main</Value>
    </Prop>
    <Prop Name='StepId' Type='String' Flags='0x0'>
        <Value>ID#:xnW0PT0ORE2el7wF7uaxyB</Value>
    </Prop>
    <Prop Name='Id' Type='Number' Flags='0x0'>
        <Value>4</Value>
    </Prop>
    <Prop Name='StepType' Type='String' Flags='0x0'>
        <Value>SequenceCall</Value>
    </Prop>
    <Prop Name='BlockLevel' Type='Number' Flags='0x0'>
        <Value>0</Value>
    </Prop>
    <Prop Name='SequenceFilePostResultListEntry' Type='Obj' Flags='0x0'>
        <Prop Name='ResultList' Type='Array' LBound='[0]' HBound='[]' ElementType='Obj' Flags='0x0'>
            <ArrayElementPrototype Type='TEResult' Flags='0x0'>
            </ArrayElementPrototype>
        </Prop>
        <Prop Name='SequenceFile' Type='String' Flags='0x0'>
            <Value>C:\Program Files\National Instruments\TestStand 2010 SP1\Components\Models\TestStandModels\SequentialModel.seq</Value>
        </Prop>
        <Prop Name='Sequence' Type='String' Flags='0x0'>
            <Value>SequenceFilePostResultListEntry</Value>
        </Prop>
        <Prop Name='Status' Type='String' Flags='0x0'>
            <Value>Passed</Value>
        </Prop>
    </Prop>
</Prop>

您可以使用XDocument解析xml,

XDocument doc = XDocument.Load("c:\\somexmlfile.xml");
XElement xProp = doc.Root.Elements().Where(p => p.Attribute("Name").Value == "StartTime").FirstOrDefault();
if (xProp != null)
{
    XElement xValue = xProp.Element("Value");
    if (xValue != null && !string.IsNullOrEmpty(xValue.Value))
    {
       double startTimeValue = double.Parse(xValue.Value);
    }
}

您的案例,您可以使用以下代码获取价值

string xml = @"<root><Prop Name='StartTime' Type='Number' Flags='0x0'>
<Value>171.8032865</Value>
</Prop></root>";
            var doc = XDocument.Parse(xml);

        foreach (var obj in doc.Descendants("Prop"))
        {
            Console.WriteLine(obj.Element("Value").Value);
        }

您的Xml不理想,理想情况下Xml和代码应如下所示

string xml = @"<root><Prop Name='StartTime' Type='Number' Flags='0x0'>171.8032865</Prop>
                        <Prop Name='StartTime' Type='Number' Flags='0x0'>172.8032865</Prop>
                        </root>";
        var doc = XDocument.Parse(xml);

        foreach (var obj in doc.Descendants("Prop"))
        {
            Console.WriteLine(obj.Value);
        }

只需使用XmlDocument

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace DemoApp
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(@"
                <Prop Name='StartTime' Type='Number' Flags='0x0'>
                <Value>171.8032865</Value>
                </Prop>");

            XmlElement element = doc.DocumentElement;
            XmlNode valueNode = element.ChildNodes[0];

            double value = double.Parse(valueNode.InnerText);

            Console.ReadLine();
        }
    }
}

确定...。获取整个xml之后...

    XDocument xmlDoc = XDocument.Load(@"Your file path");

    var startTimes = xmlDoc.Descendants()
        .Where(x => x.Attributes().Any(att => att.Name == "Name" && att.Value == "StartTime"))
        .Select(x => x.Value).ToList();

这给了我一个包含值的列表:

  • “171.6948629”
  • “171.8032865”
  • “171.8135159”
  • “171.8240739”
  • “171.8270851”

这感觉更像您在寻找什么。

您可能需要查看Visual Studio XSD工具。 看到这个问题有关如何在命令行中运行它,或者使用的详细信息Paste Special菜单选项。

该工具将直接从XML生成C#类,然后您可以对其进行序列化和编程访问。

编辑

从技术上讲,这不是直接的答案(可以随意投票)。 但是,它确实提供了一种替代解决方案,可以帮助解决读取和写入XML属性的更大问题。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;


namespace XMLdata
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load("c:\\somexmlfile.xml");
             XmlDocument doc1 = new XmlDocument();
                doc1.LoadXml (doc.ToString());
                XmlElement element = doc1.DocumentElement;
                XmlNode node= element.ChildNodes[0];

            double value = double.Parse(node.InnerText);
        }
    }
}

你可以试试这个

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM