C# 选择XML元素的值

C# 选择XML元素的值,c#,xmlreader,C#,Xmlreader,我对XML文件没有太多经验,但我正在尝试附加一个在线教程,以满足我的需要,但我没有得到预期的结果 我到处找了找,但我发现的一切对我来说都没有意义 我的XML在很大程度上是这样的: <US> <!-- Kentucky Start --> <State>Kentucky KY <City>Newport <Street>Pavilion Parkway<Number>1

我对XML文件没有太多经验,但我正在尝试附加一个在线教程,以满足我的需要,但我没有得到预期的结果

我到处找了找,但我发现的一切对我来说都没有意义

我的XML在很大程度上是这样的:

<US>
    <!-- Kentucky Start -->
    <State>Kentucky KY
        <City>Newport
            <Street>Pavilion Parkway<Number>130<PostalCode>41071</PostalCode></Number></Street>
        </City>
        <City>Corbin
            <Street>Highway 90<Number>7351<PostalCode>40701</PostalCode></Number></Street>
        </City>
    </State>
</US>
reader.Name返回“State” 值返回“空白”

我不明白为什么reader.Value不返回Kentucky KY。。。 我见过其他使用字符串生成器的示例,这是一种糟糕的方法吗?

试试xml linq:

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

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

            var results = doc.Descendants("State").Select(x => new {
                cities = x.Elements("City").Select(y => new {
                    state = (string)x,
                    city = (string)y,
                    streets = y.Elements("Street").Select(z => (string)z).ToList()
                }).ToList()
            }).SelectMany(x => x.cities).ToList();
        }
    }
}
试试xml linq:

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

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

            var results = doc.Descendants("State").Select(x => new {
                cities = x.Elements("City").Select(y => new {
                    state = (string)x,
                    city = (string)y,
                    streets = y.Elements("Street").Select(z => (string)z).ToList()
                }).ToList()
            }).SelectMany(x => x.cities).ToList();
        }
    }
}

使用
reader.ReadString()
而不是
reader.Value

使用
reader.ReadString()
而不是
reader.Value
您可以使用XmDocument(请参见:)然后使用xpath表达式从文档中获取正确的元素:

此外,最好将状态名称(即,如果您拥有xml文档)封装为以下形式:

<name>Kentucy KY</name>
肯塔基州肯塔基州
因此,您可以执行以下操作:

var items = new List<string>();

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml("yourxml");
var xmlNodes = xmlDocument.SelectNodes("//State/Name");
foreach (XmlNode node in xmlNodes)
{
    items.Add(xmlNode.Value);
}
var items=newlist();
XmlDocument XmlDocument=新的XmlDocument();
LoadXml(“yourxml”);
var xmlNodes=xmlDocument.SelectNodes(“//状态/名称”);
foreach(xmlNodes中的XmlNode节点)
{
items.Add(xmlNode.Value);
}
您可以使用XmDocument(请参阅:),然后使用xpath表达式从文档中获取正确的元素:

此外,最好将状态名称(即,如果您拥有xml文档)封装为以下形式:

<name>Kentucy KY</name>
肯塔基州肯塔基州 因此,您可以执行以下操作:

var items = new List<string>();

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml("yourxml");
var xmlNodes = xmlDocument.SelectNodes("//State/Name");
foreach (XmlNode node in xmlNodes)
{
    items.Add(xmlNode.Value);
}
var items=newlist();
XmlDocument XmlDocument=新的XmlDocument();
LoadXml(“yourxml”);
var xmlNodes=xmlDocument.SelectNodes(“//状态/名称”);
foreach(xmlNodes中的XmlNode节点)
{
items.Add(xmlNode.Value);
}

您真的需要使用
XmlReader
吗?这是一个相对较低级别的API,如果您需要流式传输一个巨大的文档,它可以很好地工作,但是通常使用LINQ to XML(
XDocument
等)将整个文档加载到内存中要简单得多。我会尽量避免使用
XmlReader
API不是很友好……没有特别的原因。正如我前面提到的,我对XML或在中读取XML文件几乎没有经验。我只是能够在一个控制台应用程序中发布教程,然后继续使用。你有推荐信吗?我非常感谢。我偶然发现了这一点,我想这可能就是我想要的。你真的需要使用
XmlReader
吗?这是一个相对较低级别的API,如果您需要流式传输一个巨大的文档,它可以很好地工作,但是通常使用LINQ to XML(
XDocument
等)将整个文档加载到内存中要简单得多。我会尽量避免使用
XmlReader
API不是很友好……没有特别的原因。正如我前面提到的,我对XML或在中读取XML文件几乎没有经验。我只是能够在一个控制台应用程序中发布教程,然后继续使用。你有推荐信吗?我非常感激。我偶然发现了这个,我想这可能就是我想要的。如何将它添加到列表框中?我的意思是打印结果是有效的,但我使用什么来分别打印州和城市?你可以通过结果枚举来获得每个值(结果中的var结果)如何将其添加到列表框中?我的意思是打印结果是可行的,但我使用什么来分别打印州和城市?您可以通过结果进行枚举以获得值foreach(var result in results)非常有效,谢谢。我可能会使用其他答案中的一个,但从技术上讲,这回答了我的问题。我建议您坚持使用XmlReader,因为它对大型Xml具有高性能。(它就像一个SAX解析器,仅限于快速和向前)工作起来很有魅力,谢谢。我可能会使用其他答案中的一个,但从技术上讲,这回答了我的问题。我建议您坚持使用XmlReader,因为它对大型Xml具有高性能。(它类似于SAX解析器,仅限于快速向前)