gpt4 book ai didi

c# - 使用XMLReader访问重名子节点

转载 作者:行者123 更新时间:2023-11-30 21:17:32 25 4
gpt4 key购买 nike

使用下面的 XML 片段,我将如何访问子节点 <amt>节点 <salesTaxAmt>使用 XMLReader?如果我遍历节点以查找节点名称“amt”,我将返回最后一个节点数量 <sourceCurrAmt>这是 0.00。

<transactionUnit>
<transactionDetails>
<transactionId>11883382</transactionId>
<currencyAmount>
<amt>30.00</amt>
<currCode>USD</currCode>
</currencyAmount>
<gstAmount>
<amt>60.00</amt>
<currCode>USD</currCode>
</gstAmount>
<pstNqstAmt>
<amt>0.00</amt>
<currCode>USD</currCode>
</pstNqstAmt>
<salesTaxAmt>
<amt>1.00</amt>
<currCode>USD</currCode>
</salesTaxAmt>
<sourceCurrAmt>
<amt>0.00</amt>
</sourceCurrAmt>
</transactionDetails>
</transactionUnit>

下面的代码是最好的方法吗?

测试代码:

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

namespace TestConsole
{
public class ParseXML
{
static void Main(string[] args)
{
try
{
FileStream file;
XmlReader baseReader;
XmlTextReader reader;
XmlReaderSettings readerSettings;

file = new FileStream(@"C:\Data.xml", FileMode.Open, FileAccess.Read);
file.Seek(0, SeekOrigin.Begin);

reader = new XmlTextReader(file, XmlNodeType.Element, null);
reader.Normalization = false;

readerSettings = new XmlReaderSettings();
readerSettings.ConformanceLevel = ConformanceLevel.Fragment;
readerSettings.IgnoreWhitespace = false;
readerSettings.IgnoreComments = true;
readerSettings.CheckCharacters = false;

baseReader = XmlReader.Create(reader, readerSettings);
int x = 0;
while (baseReader.Read())
{
if (baseReader.Name.Equals("transactionUnit") && (baseReader.NodeType == XmlNodeType.Element))
{
string amt = null;
XmlReader inner = reader.ReadSubtree();
while (inner.Read())
{
if (inner.Name.Equals("ns:amt"))
{
amt = inner.ReadElementString();
}
}
Console.WriteLine("amt: {0}", amt);
inner.Close();
x = x + 1;
}

}
Console.WriteLine("{0} transactions found", x.ToString());
baseReader.Close();
file.Close();
}
catch (XmlException xe)
{
Console.WriteLine("XML Parsing Error: " + xe);
}
catch (IOException ioe)
{
Console.WriteLine("File I/O Error: " + ioe);
}
}
}
}

最佳答案

从您的示例代码看来,您可以使用 LINQ to XML ,对于您的问题,这将是一个更简洁的解决方案:

    XDocument xDoc = XDocument.Load(@"C:\Data.xml");
string amt = xDoc.Descendants("salesTaxAmt")
.Elements("amt")
.Single().Value;

如果您可以使用 LINQ to XML 绝对应该是您的选择,它提供了一种简单而强大的语法来从 XML 中检索数据,并且可以很好地与 LINQ to objects 配合使用。

关于c# - 使用XMLReader访问重名子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4742085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com