Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从XML文档C获取正确值的问题#_C#_Xml - Fatal编程技术网

C# 从XML文档C获取正确值的问题#

C# 从XML文档C获取正确值的问题#,c#,xml,C#,Xml,我正试图用我的XML文档做几件事。我必须按版本号将csv文件的创建分开。版本4的字段比版本3多,因此,当任何一个版本生成csv时,它都应该能够将其发送到正确的文件夹C:\Version 3或C:\Version 4,具体取决于orderedfields部分中的字段数。目前我可以加载文档并获取值,但我有问题。下面的代码只提供了节点中的一个编号。它还提供了值,但即使代码运行,也会引发以下异常: CsvParser.exe中发生类型为“System.NullReferenceException”的未处

我正试图用我的XML文档做几件事。我必须按版本号将csv文件的创建分开。版本4的字段比版本3多,因此,当任何一个版本生成csv时,它都应该能够将其发送到正确的文件夹C:\Version 3或C:\Version 4,具体取决于orderedfields部分中的字段数。目前我可以加载文档并获取值,但我有问题。下面的代码只提供了节点中的一个编号。它还提供了值,但即使代码运行,也会引发以下异常:

CsvParser.exe中发生类型为“System.NullReferenceException”的未处理异常

其他信息:对象引用未设置为对象的实例

如何在不出错的情况下获取每个值,并根据中的字段数确定版本号

XmlDocument dipConfig = new XmlDocument();
dipConfig.Load("DipConfig.xml");

foreach (XmlNode versions in dipConfig.DocumentElement.ChildNodes) /*Dip level*/
{
    //string nodename = versions.ChildNodes[0].Attributes["version"].InnerText;
    foreach (XmlNode versionNode in versions) /*Versions level*/
    {
        string versionNumber = String.Empty;
        versionNumber = versionNode.Attributes["number"].InnerText;
        Console.WriteLine(versionNumber); //only gets version # for first version

        if (versionNode.HasChildNodes)
        {
            foreach (XmlNode childNodes in versionNode) /*OrderedFields level*/
            {
                string locationPath = String.Empty;
                locationPath = childNodes.Attributes["path"].InnerText;

                Console.WriteLine(locationPath); //gets location path but throws exception
            }
        }
    }
}
XML文件

<dip>
  <versions>
    <version number="4">
      <location path="C:\xRS\Output" />
      <numberOfFields> 26 </numberOfFields>
      <orderedfields>
        <type>string</type>
        <!--<field key="&gt;&gt;Dummy" />-->
        <type>int</type>
        <!--<field key="MTCN" />-->
        <type>string</type>
        <!--<field key="Type" />-->
        <type>string</type>
        <!--<field key="Agent Name" />-->
        <type>string</type>
        <!--<field key="Operator ID." />-->
        <type>string</type>
        <!--<field key="Address" />-->
        <type>string</type>
        <!--<field key="ID Type" />-->
        <type>string</type>
        <!--<field key="ID No." />-->
        <type>string</type>
        <!--<field key="ID Issuer" />-->
        <type>string</type>
        <!--<field key="WU Card No." />-->
        <type>string</type>
        <!--<field key="Sender" />-->
        <type>string</type>
        <!--<field key="Receiver" />-->
        <type>string</type>
        <!--<field key="Originating Country" />-->
        <type>string</type>
        <!--<field key="Destination" />-->
        <type>currency</type>
        <!--<field key="Amount Sent" />-->
        <type>string</type>
        <!--<field key="Currency Sent" />-->
        <type>currency</type>
        <!--<field key="Amount Received" />-->
        <type>string</type>
        <!--<field key="Currency Received" />-->
        <type>currency</type>
        <!--<field key="Total" />-->
        <type>string</type>
        <!--<field key="UID" />-->
        <type>string</type>
        <!--<field key="Version" />-->
        <type>string</type>
        <!--<field key="Breakdown" />-->
        <type>string</type>
        <!--<field key="SuspectedFlag" />-->
        <type>string</type>
        <!--<field key="FlagReason" />-->
        <type>string</type>
        <!--<field key="&gt;&gt;File Name" />-->
        <type>string</type>
        <!--<field key="&gt;&gt;Export Date Time" />-->
      </orderedfields>
    </version>
    <version number="3">
      <location path="C:\xRS\Output" />
      <numberOfFields> 23 </numberOfFields>
      <orderedfields>
        <type>string</type>
        <!--<field key="&gt;&gt;Dummy" />-->
        <type>string</type>
        <!--<field key="MTCN" />-->
        <type>string</type>
        <!--<field key="Type" />-->
        <type>string</type>
        <!--<field key="Agent Name" />-->
        <type>string</type>
        <!--<field key="Operator ID." />-->
        <type>string</type>
        <!--<field key="Address" />-->
        <type>string</type>
        <!--<field key="ID Type" />-->
        <type>string</type>
        <!--<field key="ID No." />-->
        <type>string</type>
        <!--<field key="ID Issuer" />-->
        <type>string</type>
        <!--<field key="WU Card No." />-->
        <type>string</type>
        <!--<field key="Sender" />-->
        <type>string</type>
        <!--<field key="Receiver" />-->
        <type>string</type>
        <!--<field key="Originating Country" />-->
        <type>string</type>
        <!--<field key="Destination" />-->
        <type>currency</type>
        <!--<field key="Amount Sent" />-->
        <type>string</type>
        <!--<field key="Currency Sent" />-->
        <type>currency</type>
        <!--<field key="Amount Received" />-->
        <type>string</type>
        <!--<field key="Currency Received" />-->
        <type>currency</type>
        <!--<field key="Total" />-->
        <type>string</type>
        <!--<field key="UID" />-->
        <type>string</type>
        <!--<field key="Version" />-->
        <type>string</type>
        <!--<field key="Breakdown" />-->
        <type>string</type>
        <!--<field key="SuspectedFlag" />-->
        <type>string</type>
        <!--<field key="FlagReason" />-->
        <type>string</type>
        <!--<field key="&gt;&gt;File Name" />-->
        <type>string</type>
        <!--<field key="&gt;&gt;Export Date Time" />-->
      </orderedfields>
    </version>
  </versions>
</dip>

26
一串
int
一串
一串
一串
一串
一串
一串
一串
一串
一串
一串
一串
一串
通货
一串
通货
一串
通货
一串
一串
一串
一串
一串
一串
一串
23
一串
一串
一串
一串
一串
一串
一串
一串
一串
一串
一串
一串
一串
一串
通货
一串
通货
一串
通货
一串
一串
一串
一串
一串
一串
一串

它正在
locationPath=childNodes.Attributes[“path”]上引发异常因为“位置”之后的下一个子节点是“numberOfFields”。“numberOfFields”节点没有名为“path”的属性,因此返回null作为
之前的对象。InnerText

您是否考虑过使用反序列化和类来表示配置?您可以使用一个工具,如粘贴在XML示例中,它将转换为C#类。然后可以使用对象来处理配置信息

要处理的代码

Dip dipConfig = null;
var xmlString = File.ReadAllText(@"DipConfig.xml");

using (var stream = new StringReader(xmlString))
{
    var serializer = new XmlSerializer(typeof(Dip));
    dipConfig = (Dip)serializer.Deserialize(stream);
}

foreach (var version in dipConfig.Versions.Version)
{
    Console.WriteLine(version.Number);

    foreach (var fieldType in version.Orderedfields.Type)
    {
        Console.WriteLine(fieldType);
    }
}
[XmlRoot(ElementName = "location")]
public class Location
{
    [XmlAttribute(AttributeName = "path")]
    public string Path { get; set; }
}

[XmlRoot(ElementName = "orderedfields")]
public class Orderedfields
{
    [XmlElement(ElementName = "type")]
    public List<string> Type { get; set; }
}

[XmlRoot(ElementName = "version")]
public class Version
{
    [XmlElement(ElementName = "location")]
    public Location Location { get; set; }
    [XmlElement(ElementName = "numberOfFields")]
    public string NumberOfFields { get; set; }
    [XmlElement(ElementName = "orderedfields")]
    public Orderedfields Orderedfields { get; set; }
    [XmlAttribute(AttributeName = "number")]
    public string Number { get; set; }
}

[XmlRoot(ElementName = "versions")]
public class Versions
{
    [XmlElement(ElementName = "version")]
    public List<Version> Version { get; set; }
}

[XmlRoot(ElementName = "dip")]
public class Dip
{
    [XmlElement(ElementName = "versions")]
    public Versions Versions { get; set; }
}
反序列化类

Dip dipConfig = null;
var xmlString = File.ReadAllText(@"DipConfig.xml");

using (var stream = new StringReader(xmlString))
{
    var serializer = new XmlSerializer(typeof(Dip));
    dipConfig = (Dip)serializer.Deserialize(stream);
}

foreach (var version in dipConfig.Versions.Version)
{
    Console.WriteLine(version.Number);

    foreach (var fieldType in version.Orderedfields.Type)
    {
        Console.WriteLine(fieldType);
    }
}
[XmlRoot(ElementName = "location")]
public class Location
{
    [XmlAttribute(AttributeName = "path")]
    public string Path { get; set; }
}

[XmlRoot(ElementName = "orderedfields")]
public class Orderedfields
{
    [XmlElement(ElementName = "type")]
    public List<string> Type { get; set; }
}

[XmlRoot(ElementName = "version")]
public class Version
{
    [XmlElement(ElementName = "location")]
    public Location Location { get; set; }
    [XmlElement(ElementName = "numberOfFields")]
    public string NumberOfFields { get; set; }
    [XmlElement(ElementName = "orderedfields")]
    public Orderedfields Orderedfields { get; set; }
    [XmlAttribute(AttributeName = "number")]
    public string Number { get; set; }
}

[XmlRoot(ElementName = "versions")]
public class Versions
{
    [XmlElement(ElementName = "version")]
    public List<Version> Version { get; set; }
}

[XmlRoot(ElementName = "dip")]
public class Dip
{
    [XmlElement(ElementName = "versions")]
    public Versions Versions { get; set; }
}
[XmlRoot(ElementName=“location”)]
公共类位置
{
[XmlAttribute(AttributeName=“path”)]
公共字符串路径{get;set;}
}
[XmlRoot(ElementName=“orderedfields”)]
公共类Orderedfields
{
[xmlement(ElementName=“type”)]
公共列表类型{get;set;}
}
[XmlRoot(ElementName=“version”)]
公共类版本
{
[xmlement(ElementName=“location”)]
公共位置位置{get;set;}
[xmlement(ElementName=“numberOfFields”)]
公共字符串NumberOfFields{get;set;}
[XmlElement(ElementName=“orderedfields”)]
公共Orderedfields Orderedfields{get;set;}
[XmlAttribute(AttributeName=“number”)]
公共字符串编号{get;set;}
}
[XmlRoot(ElementName=“versions”)]
公共类版本
{
[xmlement(ElementName=“version”)]
公共列表版本{get;set;}
}
[XmlRoot(ElementName=“dip”)]
公开课
{
[xmlement(ElementName=“versions”)]
公共版本版本{get;set;}
}
试试xml linq:

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

namespace ConsoleApplication45
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            var groups = doc.Descendants("version")
                .GroupBy(x => (int)x.Attribute("number"))
                .ToList();

            foreach (var group in groups)
            {
                foreach (XElement row in group)
                {
                    string location = (string)row.Element("location").Attribute("path");
                    int fields = (int)row.Element("numberOfFields");
                    string[] fieldTypes = row.Descendants("type").Select(x => (string)x).ToArray();
                    Console.WriteLine("Version : '{0}', Location : '{1}', Number Of Fields : '{2}', Columns : '{3}'", group.Key.ToString(), location, fields.ToString(), string.Join(",", fieldTypes));
                }
            }
            Console.ReadLine();


        }

    }
}

真是太棒了谢谢大家!!还有一件事,我现在如何交叉引用orderedFields中的字段数,以将计数与特定版本相匹配?(1)。您是否已经知道v.3有23个字段,v.4有26个字段,v.n=n个字段,等等。?(2.)您是否正在验证Orderedfields类型(
version.Orderedfields.Type.Count()
)的实际数量是否等于NumberOfFields值(
version.NumberOfFields
)?(3.)如果不匹配,会发生什么情况?是的,如果version.Orderedfields.Type.Count等于version.numberOfFields,您的第一个问题是正确的,那么这就是我们根据csv文件中的列数确定版本的方式。如果结果是基于其v3的匹配,则只应对该版本的文件进行整理,并对v4I尝试过的文件进行整理:foreach(dipConfig.Versions.version中的var version){int numFields=version.orderedfiels.Type.Count();Console.WriteLine(numFields);//Console.WriteLine(version.Number);但我返回了26次..检查XML文件。两个版本中都有26个
..
项。唯一不同的项是
int
项的
字符串。