【问题标题】:Easier way to get just one value from xml从 xml 中获取一个值的更简单方法
【发布时间】:2015-07-15 10:56:24
【问题描述】:

有没有更简单的方法从xml 中的一个节点获取InnerText

目前我正在使用以下代码来获取值:

var xml = new XmlDocument();
xml.LoadXml(callback); //callback
string txt = xml.FirstChild.FirstChild.FirstChild.LastChild.InnerText;

我想知道是否有任何方法可以在不加载整个 XmlDocument 的情况下获取值。我只需要访问这个节点和值。

提前致谢!

示例 XML:TRACK 节点最多出现 80 次,此处为 13 次)

<RESPONSES>
    <RESPONSE STATUS="OK">
        <ALBUM>
            <ID>some_long_id_123456789123456789</ID>
            <ARTIST>some_artist</ARTIST>
            <TITLE>some_album</TITLE>
            <PKG_LANG>ENG</PKG_LANG>
            <DATE>1234</DATE>
            <GENRE NUM="123456" ID="654321">some_string</GENRE>
            <TRACK_COUNT>13</TRACK_COUNT>
            <TRACK>
                <TRACK_NUM>1</TRACK_NUM>
                <ID>some_id_123456789</ID>
                <TITLE>some_title</TITLE>
            </TRACK>
            ...
            <TRACK>
                <TRACK_NUM>13</TRACK_NUM>
                <ID>some_id_123456789_13</ID>
                <TITLE>some_title_13</TITLE>
            </TRACK>
            <URL TYPE="IMAGE" SIZE="MEDIUM" WIDTH="123456" HEIGHT="123456">the_url_i_wanna_access</URL>
        </ALBUM>
    </RESPONSE>
</RESPONSES>

【问题讨论】:

  • 您可以使用XmlReader逐个读取节点,直到找到您想要的节点。
  • 首先,我会使用 LINQ to XML 而不是 XmlDocument。然后我会创建一个可读的查询。如果 XML 很大,您可以直接使用 XmlReader 等较低级别的 API 来提高性能。您需要提供一些上下文 - XML 以及您想要的内容。
  • @CharlesMager 添加了示例 xml,正在编辑和缩短它以适应这里..
  • 所以你想得到第一个TRACKTITLE
  • @CharlesMager no,xml.FirstChild.FirstChild.FirstChild.LastChild.InnerText 导致专辑节点末尾的URL 标签,尤其是内部文本(“the_url_i_wanna_access”)

标签: c# xml xml-parsing xmldocument


【解决方案1】:

使用 LINQ to XML 的解决方案可能很简单:

var doc = XDocument.Parse(xml);
var url = (string)doc.Descendants("URL").Single();

这比您已经拥有的XmlDocument API 代码更具可读性。

如果您担心性能(我不确定这个 XML 是否足够大以保证这一点),您可以直接使用 XmlReader 来避免将所有 XML 加载到 DOM 中以读取一段文本:

string url;

using (var sr = new StringReader(xml))
using (var reader = XmlReader.Create(sr))
{
    while (reader.Read())
    {
        if (reader.NodeType == XmlNodeType.Element && reader.Name == "URL")
        {
            url = reader.ReadElementString();
            break;
        }
    }
}

【讨论】:

  • 我想改进 Charles 的回答:return (string)doc.Descendants().Single(e =&gt; string.Equals(e.Name.LocalName, "URL", StringComparison.OrdinalIgnoreCase); 如果有人使用命名空间定义,这将继续工作
  • @BerndK ...但在这种情况下没有命名空间?如果有的话,最好指定完全限定名称,而不是只比较本地名称(更不用说只比较本地名称而忽略大小写)。
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
相关资源
最近更新 更多