【问题标题】:Querying XML document查询 XML 文档
【发布时间】:2012-10-31 02:17:31
【问题描述】:

我正在尝试查询一个 xml 文档,但此代码不会读取带有封闭标记符号的 xml 部分,但可以读取很好的 xelement。谁能发现我做错了什么?

我有程序生成的 XML 文档,它给出了封闭的标记文件,因此它现在是一个问题..

<?xml version="1.0" encoding="utf-8" ?>
<Student>

 <Person name="John" city="Auckland" country="NZ" />

 <Person>
    <Course>GDICT-CN</Course>
    <Level>7</Level>
    <Credit>120</Credit>
    <Date>129971035565221298</Date>
 </Person>
 <Person>
    <Course>GDICT-CN</Course>
    <Level>7</Level>
    <Credit>120</Credit>
    <Date>129971036040828501</Date>
 </Person>
</Student>
class Program
{
    static void Main(string[] args)
    {
        XDocument xDoc = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "Customers.xml");
        IEnumerable<XElement> rows = from row in xDoc.Descendants("Person") select row;

        foreach(XElement xEle in rows)
        {
        IEnumerable<XAttribute>attlist = from att in xEle.DescendantsAndSelf().Attributes() select att;

            foreach(XAttribute xatt in attlist)
            {
            Console.WriteLine(xatt);
            }
            Console.WriteLine("-------------------------------------------");
        }
        Console.ReadLine();

    }
}

【问题讨论】:

    标签: c# xml linq xml-parsing linq-to-xml


    【解决方案1】:

    首先,您必须导航到 Person 级别并遍历 Persons,然后对于每个 Person,您可以遍历其属性。

        private static void Main(string[] args)
        {
            //string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            //XDocument xDoc = XDocument.Load(path + "\\Student Data\\data.xml");
            XDocument xDoc = XDocument.Load(AppDomain.CurrentDomain.BaseDirectory + "Customers.xml");
            IEnumerable<XElement> xElements = xDoc.Descendants("Person");
            foreach (XElement element in xElements)
            {
                foreach (XAttribute attribute in element.Attributes())
                {
                    Console.WriteLine(attribute);
                }
                Console.WriteLine("-------------------------------------------");
            }
            Console.ReadLine();
        }
    

    【讨论】:

      【解决方案2】:

      由于您已将Course 和其他属性添加为XElement,因此您需要循环XElements 而不是属性-

      foreach (XElement xEle in rows)
      {
          IEnumerable<XAttribute> attlist = from att in xEle.DescendantsAndSelf()
                                              .Attributes() select att;
      
          foreach (XAttribute xatt in attlist)
          {
             Console.WriteLine(xatt);
          }
          foreach (XElement elemnt in xEle.Descendants())
          {
             Console.WriteLine(elemnt.Value);
          }
          Console.WriteLine("-------------------------------------------");
      }
      

      【讨论】:

      • 这就像魅力..我试图了解它有什么不同,如果你不介意的话,你能简单地说一下吗..谢谢。
      • XAttribute 用于属性,而XElement 用于子节点。在第一行中,您已将 namecitycountry 声明为属性。但是在接下来的两行中,您创建了子节点,这就是为什么您需要循环 Descendantscollection 来获取它们的值。
      • 谢谢,如果我想过滤值,我无法使用下面的过滤器代码获取子元素值,你能检查一下吗??? IEnumerable rows = from row in xDoc.Descendants("Person") where (string)row.Attribute("Level") == "7" select row;
      • @raam030 您应该避免在 cmets 中提出后续问题。如果您要澄清现有问题,请编辑您的问题。如果你有一个新问题,你应该问一个新问题。听起来你应该问一个新问题,因为它与你原来的问题并没有真正的关系。
      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多