使用 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。
我需要阅读以下 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。