使用 C# 读取 XML 文件不适用于某些 xml 文件

Reading a XML file using C# not working for some xml files

我需要阅读以下 xml 文件。我用过 XML 和 LINQ,但它们都没有显示任何 values.I 在代码上找不到任何错误。 我遵循了 This 示例,它与那里显示的 XML 一起工作正常。

<dataSet>
<transactions>
<trans>1</trans>
<Amount>1000</Amount>
<Name>1000</Name>
<Type>Income</Type>
<Date>2022-04-21T00:00:00+05:30</Date>
</transactions>
</dataSet>

我用过这个代码。

using System;
using System.Xml;

namespace ReadXMLInCsharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //create XMLDocument object
            XmlDocument xmlDoc = new XmlDocument();

            //returns url of main directory which contains "/bin/Debug"
            var url = System.IO.Path.GetDirectoryName(
    System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase);

            //correction in path to point it in Root directory
            var mainpath = ("F:\Education\Test\new.xml");
            //load xml file
            xmlDoc.Load(mainpath);

            XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("/dataSet/transactions");

            
            var NodeStr = "";

            foreach (XmlNode node in nodeList)
            {
                NodeStr = NodeStr + "\nTransaction " + node.SelectSingleNode("trans").InnerText;
               


            }
            Console.WriteLine(NodeStr);
        }
    }
}

您的 XML 文件有并且您正在通过数据集解析它。 “s”在您的代码中是小写的。将其设置为 XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("/dataSet/transactions");

同时检查 XML 的路径是否正确。

您的 xml DataSet 节点具有命名空间属性,因此您需要将其删除或使用 XmlNamespaceManager 来处理它。这是一个 fiddle,同时包含:

https://dotnetfiddle.net/EOXtBN

首先,我将 xml 加载到一个字符串中,然后使用 .Replace:

xmlDoc.LoadXml(getXML().Replace(" xmlns='tempuri.org/DataSet.xsd'", ""));

可能不是最佳选择,因为该命名空间可能存在是有原因的,但这可能是您的一个选择。这是我第一个工作的。

其次,我使用 XmlNamespaceManager 来处理解析。它不会增加那么多开销:

xmlDoc.LoadXml(getXML());
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable);
nsmgr.AddNamespace("ns", "tempuri.org/DataSet.xsd");
        
nodeList = xmlDoc.DocumentElement.SelectNodes("//ns:DataSet//ns:transactions", nsmgr); 
foreach (XmlNode node in nodeList) {
  NodeStr = NodeStr + "\nTransaction " + node.SelectSingleNode("ns:trans", nsmgr).InnerText;       
}

此外,请记住,您可以只在节点列表的 xpath 中包含 ns:trans,如下所示:

nodeList = xmlDoc.DocumentElement.SelectNodes("//ns:DataSet//ns:transactions//ns:trans", nsmgr); 
foreach (XmlNode node in nodeList) {
  NodeStr = NodeStr + "\nTransaction " + node.InnerText;       
}
Console.WriteLine(NodeStr);

您也可以使用 += 来进一步清理它:

nodeList = xmlDoc.DocumentElement.SelectNodes("//ns:DataSet//ns:transactions//ns:trans", nsmgr); 
foreach (XmlNode node in nodeList) {
  NodeStr += "\nTransaction " + node.InnerText;       
}
Console.WriteLine(NodeStr);

让我知道这是否适合你。

我注意到这种事情在更现代的 LINQ to XML API 中通常要好得多。它可能看起来像这样(尽管有很多方法可以给猫剥皮):

XNamespace ns = "tempuri.org/DataSet.xsd";

var doc = XDocument.Load(mainpath);

var lines =
    from dataSet in doc.Elements(ns + "dataSet")
    from transactions in dataSet.Elements(ns + "transactions")
    from trans in transactions.Elements(ns + "trans")
    select $"Transaction {trans.Value}";

var nodeStr = string.Join(Environment.NewLine, lines);

Console.WriteLine(nodeStr);

有关工作演示,请参阅 this fiddle