C# 使用XmlReader读取XML

C# 使用XmlReader读取XML,c#,xml,.net-3.5,xpath,xmlreader,C#,Xml,.net 3.5,Xpath,Xmlreader,我在使用XmlReader读取XML文件时遇到一些问题。我可以打开和关闭文件(我想),但是当涉及到解析我需要的信息时,我有点不知所措。以下是我需要解析的文件位: <?xml version="1.0" encoding="UTF-8"?> <database name="Dictionary"> <data> <Translations> <Translation UniversalAbbv="Enu" lang="e

我在使用
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>

我知道不多,但我有点不知道该怎么办。任何帮助都将不胜感激。谢谢。

您可能想看一下。它的功能非常易于使用,比使用XMLReader容易得多


获取EnumID=“1”项所需的全部操作是
//Enums/Enum_条目[@EnumID=1]

您可能想看看。它的功能非常易于使用,比使用XMLReader容易得多


获取EnumID=“1”项所需的全部操作是
//Enums/Enum_条目[@EnumID=1]

下面是使用xml读取器读取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));
intCount=0;
XmlReaderSettings objSettings=新的XmlReaderSettings();
objSettings.IgnoreWhitespace=true;
objSettings.IgnoreComments=true;
字符串booksFile=Server.MapPath(“books.xml”);
使用(XmlReader objReader=XmlReader.Create(booksFile,objSettings))
{
while(objReader.Read())
{
if(objReader.NodeType==XmlNodeType.Element&“Book”==objReader.LocalName)
{
intCount++;
}
if(objReader.NodeType==XmlNodeType.Text)
{
响应。写入(“
”+objReader.Value); } } } Write(String.Format(“



Total{0}books.”,intCount));
下面是使用xml读取器读取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));
intCount=0;
XmlReaderSettings objSettings=新的XmlReaderSettings();
objSettings.IgnoreWhitespace=true;
objSettings.IgnoreComments=true;
字符串booksFile=Server.MapPath(“books.xml”);
使用(XmlReader objReader=XmlReader.Create(booksFile,objSettings))
{
while(objReader.Read())
{
if(objReader.NodeType==XmlNodeType.Element&“Book”==objReader.LocalName)
{
intCount++;
}
if(objReader.NodeType==XmlNodeType.Text)
{
响应。写入(“
”+objReader.Value); } } } Write(String.Format(“



Total{0}books.”,intCount));

您使用XMLReader而不是LINQ甚至XMLDocument有什么原因吗?我通常会读入数据集,然后索引到其中以查找我感兴趣的值。我很好奇别人会怎么做。@AlexMendez:我以前从未需要解析XML文件。LINQ是.NET类吗?@timmy:数据集是如何使用的?您可以链接到一个示例吗?LINQ是一种语言集成查询,是.net 3.5及更高版本的一部分。它允许您以类似于sql server的方式查询xml。以下是一些示例:您使用XMLReader而不是LINQ甚至XMLDocument有什么原因吗?我通常会读入数据集,然后索引到其中以查找我感兴趣的值。我很好奇别人会怎么做。@AlexMendez:我以前从未需要解析XML文件。LINQ是.NET类吗?@timmy:数据集是如何使用的?您可以链接到一个示例吗?LINQ是一种语言集成查询,是.net 3.5及更高版本的一部分。它允许您以类似于sql server的方式查询xml。以下是一些示例:
XPathNavigator
的使用似乎简单得多。后来我了解到,我需要使用
“STOPRUN\u ENUM\u SET”
从我发布的XML中获取
“Stop”
和“Run”属性。使用
XPathNavigator
STOPRUN\u ENUM\u SET
有没有办法做到这一点?根据你的例子,这似乎没有多大意义。我猜你的意思是停止运行
//Enum_Entry[@Enum_H=“STOPRUN_STOP”]
无论如何,如果您不想对所有内容都进行编码,您可以在:处处理查询,然后查看哪个查询被选中。这是我到目前为止使用的表达式,但它没有从XML文件中提取任何内容:
Translations/Translation/Set/TwoSet[@Enum_H='STOPRUN\u Enum_Set']/../Enums/Enum_Entry[@EnumID<2]
/Translations/Translation/Set/TwoSet[@ENUM\u H='STOPRUN\u ENUM\u Set']至少可以提取整个集合……但是,在您的示例xml中,您遗漏了TwoSet项的数据。无论如何,
//TwoSet
也会这样做。如果您不需要从itOkay获得任何信息,则不必从根节点开始,我想我已经解决了。感谢所有帮助!
//set/TwoSet[@ENUM\u H='STOPRUN\u ENUM\u set']/../Enums/Enum_Entry[@EnumID
XPathNavigator
的使用似乎简单得多。后来我了解到,我需要使用
“STOPRUN\u Enum_SET”
来获取
“Stop”
和“Run”`我发布的XML中的属性。使用
XPathNavigator
有没有办法做到这一点?
STOPRUN\u ENUM\u SET
?根据您的示例,这似乎没有多大意义。我猜您的意思是
STOPRUN\u STOP
//ENUM\u Entry[@ENUM\u H=“STOPRUN\u STOP”]
无论如何,如果您不想对所有内容都进行编码,您可以在以下位置处理查询:并查看选择了哪一个。这是到目前为止我使用的表达式,但它没有从XML文件中提取任何内容:
Translations/Translation/Set/TwoSet[@ENUM_H='STOPRUN_ENUM_Set']/../Enums/ENUM_Entry[@EnumID<2]
//Translations/Translation/Set/TwoSet[@ENUM\u H='STOPRUN\u ENUM\u Set']
至少可以提取整个集合……但是,在您的示例xml中,您遗漏了TwoSet项的数据。无论如何,
//TwoSet
也会这样做。如果您不需要从itOkay获得任何信息,则不必从根节点开始,我想我已经解决了。感谢所有帮助!
//set/TwoSet[@ENUM\u H='STOPRUN\u ENUM\u set']/../Enums/Enum_条目[@EnumID