简体   繁体   English

使用带有 C# 的 XmlDocument 读取 XML 数据 - 读取属性数据并拆分结果

[英]Reading XML data using XmlDocument with C# - Reading attribute data and splitting the results

I'm trying to read some XML data using XmlDocument and having a few challenges.我正在尝试使用XmlDocument读取一些 XML 数据并遇到一些挑战。

My issues are as follows:我的问题如下:

  1. When I try to get the bfihost value, it gives me the bfihost , propwet and saar element values combined as a single output.当我尝试获取bfihost值时,它给了我bfihostpropwetsaar元素值组合为单个 output。 Why is this and how do I get just the bfihost ?为什么会这样,我如何获得bfihost

  2. Each Depth element has an attribute named duration .每个Depth元素都有一个名为duration的属性。 My first foreach loop writes the string durationString to the console, but it doesn't seem to find any attributes called duration in the XmlNode chldNode .我的第一个foreach循环将字符串durationString写入控制台,但它似乎没有在XmlNode chldNode中找到任何名为duration的属性。

  3. This issue is probably less important, but when I find the value for the element ReturnPeriods for example I can only retrieve all the values separated by commas.这个问题可能不太重要,但是当我找到元素ReturnPeriods的值时,我只能检索用逗号分隔的所有值。 This isn't an issue as I've just used the Split(',') method and assigned it to an array and looped through that.这不是问题,因为我刚刚使用了Split(',')方法并将其分配给一个数组并循环遍历它。 I was curious if XmlDocument had a more elegant way of doing this?我很好奇XmlDocument是否有更优雅的方式来做到这一点?

Thanks for any help received.感谢您收到的任何帮助。

Here is a stripped down version of the XML data.这是 XML 数据的精简版本。 The , ... have been added as there is a lot more data in the actual xml file. , ...已添加,因为实际 xml 文件中有更多数据。

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<FEHCDROMExportedDescriptors appVersion="2.0.0.0" version="2.0.1">
    <PointDescriptors y="111111" x="222222" grid="GB">
        <bfihost>0.386</bfihost>
        <propwet>0.3</propwet>
        <saar>643</saar>
    </PointDescriptors>
    <PointDDF2013Values>
        <ReturnPeriods>
            <![CDATA[
                1.3, 1.58, 2, ...
            ]]>
        </ReturnPeriods>
        <Depths duration="0.083">
            <![CDATA[
                3.27693489525396, 3.98688804941076, 4.68688804941076, ...
            ]]>
        </Depths>
        <Depths duration="0.25">
            <![CDATA[
                5.37693489525396, 6.51484587430874, 7.81484587430874, ...
            ]]>
        </Depths>
        <Depths duration="0.5">
            <![CDATA[
                6.87693489525396, 8.38688804941076, 10.0017339237195, ...
            ]]>
        </Depths>
    </PointDDF2013Values>
</FEHCDROMExportedDescriptors>

The code I have written is as follows:我写的代码如下:

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(file);

            XmlTextReader reader = new XmlTextReader(file);
            XmlNode node = xmlDoc.ReadNode(reader);

            string durationString;
            foreach (XmlNode chldNode in node.ChildNodes)
            {
                //Read the attribute duration
                if (chldNode.Name == "Depths")
                {
                    if (chldNode.HasChildNodes)
                    {
                        foreach (XmlNode item in node.ChildNodes)
                        {
                            durationString = chldNode.Attributes["duration"].Value;
                            Console.WriteLine("durations[]: " + durationString);

                        }
                    }
                }
            }


            XmlNodeList pointDescriptors = xmlDoc.GetElementsByTagName("PointDescriptors");
            XmlElement xmlElement = (XmlElement)pointDescriptors[0];

            // Get coordinates
            XmlAttribute y = xmlElement.GetAttributeNode("y");
            Console.WriteLine("y[]: " + y.InnerXml);
            XmlAttribute x = xmlElement.GetAttributeNode("x");
            Console.WriteLine("x[]: " + y.InnerXml);

            // for some reason returns the bfi Host, propwet and saar
            XmlNodeList bfihost = xmlDoc.GetElementsByTagName("bfihost");
            Console.WriteLine("bfihost[]: " + pointDescriptors[0].InnerText);

            // returns all return periods as a string.
            XmlNodeList returnPeriods = xmlDoc.GetElementsByTagName("ReturnPeriods");
            //Console.WriteLine("Return Periods[]: " + returnPeriods[0].InnerText);

            //I can split the string by commas and remove white spaces as follows
            string[] returnPeriodsArray = returnPeriods[0].InnerText.Split(',').Select(sValue => sValue.Trim()).ToArray();
            foreach (string s in returnPeriodsArray)
            {
                //System.Console.Write("{0} ", s);
            }

            int k = 0;
            //Loop through all the depths, and split the results
            XmlNodeList depths = xmlDoc.GetElementsByTagName("Depths");
            XmlAttribute duration;
            for (int i = 0; i < depths.Count; i++)
            {
                if (depths[i].InnerText.Length > 0)
                {
                    
                    System.Console.Write("{0} ", "\n\n" + "Depth xxx" + "\n\n");
                    string[] depthsArray = depths[i].InnerText.Split(',').Select(sValue => sValue.Trim()).ToArray();
                    foreach (string s in depthsArray)
                    {
                        System.Console.Write("{0} ", "(" + returnPeriodsArray[k] + ") - " + s + "\n");
                        k++;
                        if (k > 21)
                        {
                            k = 0;
                        }
                    }
                
                }
            }

And the output I get is:我得到的 output 是:

y[]: 11111 //correct
x[]: 22222 //correct
bfihost[]: 0.3860.3643 //this is combination of three elements for some reason?

///Here I try to get the depth data but nothing is returned.

Depth xxx // xxx is just a place holder until I can fix the above issue.

 (1.3) - 3.27693489525396 //all these outputs are correct.
 (1.58) - 3.98688804941076
 (2) - 4.68688804941076


Depth xxx

 (1.3) - 5.37693489525396
 (1.58) - 6.51484587430874
 (2) - 7.81484587430874



Depth xxx

 (1.3) - 6.87693489525396
 (1.58) - 8.38688804941076
 (2) - 10.0017339237195

It is better to use LINQ to XML API.最好使用 LINQ 到 XML API。 It is available in the.Net Framework since 2007.它自 2007 年起在 .Net Framework 中可用。

c# c#

void Main()
{
    const string fileName = @"e:\Temp\FEHCDROME.xml";
    XDocument xdoc = XDocument.Load(fileName);
    
    XElement xelem = xdoc.Descendants("PointDescriptors").FirstOrDefault();

    Console.WriteLine("PointDescriptors:");
    Console.WriteLine("y[]: {0}", xelem.Attribute("y").Value);
    Console.WriteLine("x[]: {0}", xelem.Attribute("x").Value);
    Console.WriteLine("bfihost[]: {0}", xelem.Element("bfihost").Value);

    XElement rp = xdoc.Descendants("ReturnPeriods").FirstOrDefault();
    Console.WriteLine("{0}ReturnPeriods:", Environment.NewLine);
    foreach (string s in rp.Value.Split(',').Select(sValue => sValue.Trim()).ToArray())
    {
        Console.WriteLine("{0} ", s);
    }

    Console.WriteLine("{0}Depths:", Environment.NewLine);
    foreach (XElement dp in xdoc.Descendants("Depths"))
    {
        foreach (string s in dp.Value.Split(',').Select(sValue => sValue.Trim()).ToArray())
        {
            Console.WriteLine("{0} ", s);
        }
    }
}

Output Output

PointDescriptors:
y[]: 111111
x[]: 222222
bfihost[]: 0.386

ReturnPeriods:
1.3 
1.58 
2 
... 

Depths:
3.27693489525396 
3.98688804941076 
4.68688804941076 
... 
5.37693489525396 
6.51484587430874 
7.81484587430874 
... 
6.87693489525396 
8.38688804941076 
10.0017339237195 
... 

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

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