【问题标题】:Using XmlReader to Read XML使用 XmlReader 读取 XML
【发布时间】:2011-11-08 18:04:36
【问题描述】:

我在使用 XmlReader 读取 XML 文件时遇到了一些问题。我可以打开和关闭文件(我认为),但是在解析我需要的信息时,我有点迷茫。这是我需要解析的文件位:

<?xml version="1.0" encoding="UTF-8"?>
<database name="Dictionary">
  <data>
    <Translations>
      <Translation UniversalAbbv="Enu" lang="en" localization="US" unicode="0">
        <Set>
          ...
        </Set>
        <Set>
          ...
        </Set>
        <Set>
          <CaseSensitive value="0" />
          <Enums translate="1">
            <Enum_Entry ENUM_H="STOPRUN_STOP" EnumID="0" EnumString="Stop" SetID="160" />
            <Enum_Entry ENUM_H="STOPRUN_RUN" EnumID="1" EnumString="Run" SetID="160" />
            <Enum_Entry ENUM_H="STOPRUN_HOLD " EnumID="2" EnumString="Hold" SetID="160" />
          </Enums>
          <IncludeFiles_cs name="CSFile" value="StopRun.cs" />
          <IncludeFiles_h name="Header" value="NULL" />
          <IncludeFiles_java name="Java" value="NULL" />
          <SetID value="160" />
          <SetName value="Stop Run" />
          <TwoSet ENUM_H="STOPRUN_ENUM_SET" />
        </Set>
        <Set>
          ...
        </Set>
   </Translation>
  </Translations>
  </data>
</database>

我需要找到EnumID="0"EnumID="1"(或"STOPRUN_STOP""STOPRUN_RUN")并分别拉出"Stop""Run"字符串。到目前为止,这是我的代码:

static class Dictionary
{
    static private XmlReader Reader = null;

    static public void Open()
    {
        XML_Generator.Dictionary.Reader = XmlReader.Create(XML_Generator.Program.DictionaryFilename);
    }

    static public void Close()
    {
        XML_Generator.Dictionary.Reader.Close();
    }

    static public void Read()
    {
        while (Reader.Read())
        {
            Trace.TraceInformation(XML_Generator.Dictionary.Reader.ReadElementContentAsString()); // <-- This throw an error. :(
        }
    }
}

我知道这并不多,但我有点不知道该去哪里。任何帮助,将不胜感激。谢谢。

【问题讨论】:

  • 您使用 XMLReader 而不是 LINQ 甚至 XMLDocument 有什么原因吗?
  • 我通常会读入一个数据集,然后对其进行索引以查找我感兴趣的值。很想看看其他人是如何做到的。
  • @AlexMendez:我以前从不需要解析 XML 文件。 LINQ 是 .NET 类吗?
  • @timmy:数据集是如何使用的?你能链接到一个例子吗?
  • LINQ 是一种语言集成查询,是 .net 3.5 及更高版本的一部分。它允许您以与 sql server 类似的方式查询您的 xml。以下是一些示例:msdn.microsoft.com/en-us/library/bb397965.aspxmsdn.microsoft.com/en-us/library/bb387061.aspx

标签: c# xml .net-3.5 xpath xmlreader


【解决方案1】:

这里是使用 XML Reader 读取 xml 文件的示例

   int intCount = 0;
    XmlReaderSettings objSettings = new XmlReaderSettings();
    objSettings.IgnoreWhitespace = true;
    objSettings.IgnoreComments = true;
    string booksFile = Server.MapPath("books.xml");
    using (XmlReader objReader = XmlReader.Create(booksFile, objSettings))
    {
        while (objReader.Read())
        {
            if (objReader.NodeType == XmlNodeType.Element && "Book" == objReader.LocalName)
            {
                 intCount++;
            }
            if (objReader.NodeType ==XmlNodeType.Text )
            {
                Response.Write("<BR />" + objReader.Value);
            }
        }
    }
    Response.Write(String.Format("<BR /><BR /><BR /><b> Total {0} books.</b>", intCount));

【讨论】:

    【解决方案2】:

    您可能想看看XpathNavigator。它的syntax 真的很容易使用,比使用XMLReader 容易得多

    要获得 EnumID="1" 项目,您需要做的就是//Enums/Enum_Entry[@EnumID=1]

    【讨论】:

    • XPathNavigator 似乎使用起来更简单。从那以后,我了解到我需要使用 "STOPRUN_ENUM_SET" 从我发布的 XML 中获取 "Stop" 和 '"Run"` 属性。有没有办法用XPathNavigator 做到这一点?
    • STOPRUN_ENUM_SET?根据您的示例,这似乎没有多大意义。我猜你的意思是STOPRUN_STOP//Enum_Entry[@ENUM_H="STOPRUN_STOP"] 无论如何,如果你不想编写所有代码,你可以在 mizar.dk/XPath/Default.aspx> 处搞乱查询,看看哪个被选中。
    • 这是我到目前为止的表达式,但它没有从 XML 文件中提取任何内容:Translations/Translation/Set/TwoSet[@ENUM_H='STOPRUN_ENUM_SET']/../Enums/Enum_Entry[@EnumID &lt; 2]
    • //Translations/Translation/Set/TwoSet[@ENUM_H='STOPRUN_ENUM_SET'] 至少提取了整个集合...但是,在您的示例 xml 中,您遗漏了 TwoSet 项的数据。无论如何,只要//TwoSet 做同样的事情。如果你不需要它的任何东西,你不必从根节点开始
    • 好的,我想我明白了。感谢所有的帮助! //Set/TwoSet[@ENUM_H='STOPRUN_ENUM_SET']/../Enums/Enum_Entry[@EnumID&lt;2]
    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 2011-01-27
    • 2012-10-20
    • 1970-01-01
    • 2014-03-20
    • 2013-09-08
    • 2016-12-05
    • 1970-01-01
    相关资源
    最近更新 更多