用 C# .Net 解析 XML 字符串

5

我阅读了这里的旧帖子以及我在谷歌上找到的页面,可以诚实地说这让我完全困惑了。似乎使用C# .NET解析XML字符串有1000种方法,而我不知道该使用哪一种。似乎我所找到的所有示例都依赖于特定命名的根节点等等。

我所拥有的是...

<whmcsapi version="4.1.2"> 
 <action>getstaffonline</action> 
 <result>success</result> 
 <totalresults>1</totalresults> 
 <staffonline> 
  <staff> 
   <adminusername>Admin</adminusername> 
   <logintime>2010-03-03 18:29:12</logintime> 
   <ipaddress>127.0.0.1</ipaddress> 
   <lastvisit>2010-03-03 18:30:43</lastvisit> 
  </staff> 
 </staffonline> 
</whmcsapi>

我只需要获取 和每个员工信息(包含在 标签中)的值。有人能告诉我最佳方法是什么,可能还提供一个小例子吗?
谢谢!

提示:您的根节点命名为whmcsapi - Byron Whitlock
1
可能是重复的问题:如何在C#中读取和解析XML文件? - Byron Whitlock
2
问题是我没有解析文件,而是将XML数据存储在字符串中。我找到的所有内容都是关于如何解析文件的。 - user470760
4个回答

12
var staff = XDocument.Parse(myXml)
    .Descendants("staff")
    .Select(n => new { 
                         adminusername = n.Element("adminusername").Value,
                         ...
                     });

3

如今最常用的是Linq to XML,它将XML解析集成到Linq中,具有简洁、表达力强的语法:

XDocument xmlDoc = XDocument.Load(@"testData.xml");
var    staffMembers = xmlDoc.Descendants("staff")
                        .Select( staff => new { Name = staff.Element("adminusername").Value,
                                                LoginTime = staff.Element("logintime").Value,
                                                IpAddress = staff.Element("ipaddress").Value,
                                                LastVisit = staff.Element("lastvisit").Value,
                                            }).ToList();

我不明白为什么会出现问题。无论我如何尝试,都会得到“路径中有非法字符”的错误。我不能像这样从字符串中加载它吗?http://www.ampaste.net/m3651f133 - user470760
1
使用XDocument.Parse(myString)从字符串加载。 - BrokenGlass
啊,谢谢,我刚才从另一个评论中注意到了这一点。你看出来为什么这不起作用吗?方法底部的两个部分没有更新列表框和标签,尽管XML被正确地提取了。所以我认为这是一个解析问题。http://www.ampaste.net/m61f246e1 - user470760
对不起,我认为他们的网站出现了问题,链接现在应该可以使用了。 - user470760

0
XDocument doc = XDocument.Load("staff.xml");

var query = from r in doc.Descendants("staff")
            select new
                   {
                      Adminusername = r.Element("adminusername").Value,
                      LoginTime = r.Element("logintime").Value,
                      IpAddress = r.Element("ipaddress").Value,
                      LastVisit = r.Element("lastvisit").Value
                   };

-3
这里有一个我使用的函数,可以完美地解析XML文件。 我还包括了一个“分隔符”类,您可以使用它来存储XML分隔符,例如


<startTag></endTag>

非常容易使用,而且运行得很好...如果您有任何问题,请告诉我

像这样使用函数:

XmlDataManager.List<XmlManager.Delimeter> delimeters = new List<XmlManager.Delimeter>("<result>","</result>"); 
int[] splitIndexArray = { 1 }; // Tells the function where to split in case where the same value occurs multiple times in a line... usually 1 need an entry for each value 
String testValue = "";
List<String> values = new List<String> {testValue}
XmlDataManager.ReadValues(delimeters, values, `<xmlFileNameHere>,` splitIndexArray);

以下是类的定义:

这是一个类:

   public class XmlDataManager 
{
    const String XML_FILE_WRITE_FAIL = "Could not write to xml file";
    const String XML_FILE_READ_FAIL = "Could not read from xml file";
    const String XML_FILE_WRITE_BUILDER_FAIL = "Could not write values to string";  


   /// <summary>
    /// 
    /// </summary>
    public struct Delimeter
    {
        internal String StartDelimeter { get { return _startDelimeter; } }
        internal String EndDelimeter { get { return _endDelimeter; } }
        private readonly String _startDelimeter;
        private readonly String _endDelimeter;

        public Delimeter(String startDelimeter, String endDelimeter)
        {
            _startDelimeter = startDelimeter;
            _endDelimeter = endDelimeter;
        }

        public Delimeter(String startDelimeter)
        {
            _startDelimeter = startDelimeter;
            _endDelimeter = String.Empty;
        }
    }


    public static void ReadValuesLineByLine(    List<Delimeter> elementDelimeters, 
                                                List<String> values, 
                                                String fileName, 
                                                int[] splitIndexes)
    {
        try
        {
            using (StreamReader sr = new StreamReader(fileName))
            {
                String line = sr.ReadLine();
                while (!sr.EndOfStream)
                {
                    for (int i = 0; i <= values.Count-1; i++)
                    {
                        if (line.Contains(elementDelimeters[i].StartDelimeter))
                        {
                            String[] delimeters = { elementDelimeters[i].StartDelimeter, elementDelimeters[i].EndDelimeter };
                            String[] elements = line.Split(delimeters, StringSplitOptions.None);
                            values[i] = elements[splitIndexes[i]];
                        }
                    }
                     line = sr.ReadLine();
                }
            }
        }
        catch(Exception ex)
        {
            throw new Exception(XML_FILE_READ_FAIL, ex);
        }
    }
}

Peter


1
你为什么要发明自己的XML解析类,当已经有完全可以胜任的开箱即用功能呢?我必须说我有点震惊。 - BrokenGlass
认真地说,你为什么要这样对自己呢? - Jordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接