【问题标题】:XML dynamic content to extract in C# object要在 C# 对象中提取的 XML 动态内容
【发布时间】:2014-12-03 08:26:48
【问题描述】:

我有一个包含动态内容的 xml 源

<content base="path">
<folder name="Test_dossier1">
    <folder name="Test_dossier2">
        <folder name="Test_dossier3">
            <file name="test_fichier3.txt"/>
        </folder>
    <file name="test_fichier2.txt"/>
</folder>
<file name="test_fichier1.txt"/>
</folder>
<file name="adlcp_rootv1p2.xsd"/>
<file name="base64.js"/>
<file name="eniscormres.htm"/>
<file name="functions.js"/>
<file name="imscp_rootv1p1p2.xsd"/>
<file name="imsmanifest.xml"/>
</content>

所以文件夹节点是动态的。这可以有 X 个文件夹和文件节点子节点。 如何解析这个动态节点?

这是我提取文件节点的 xml 解析代码:

var files = content.SelectNodes ("file");
        foreach (System.Xml.XmlNode element in files) {
            var file = new OfflineGetCourseContentFile {
                Id = q.Id,
                File = element.Attributes.GetNamedItem ("name").Value
            };
            InsertSqliteDb.InsertIntoDB (file);
        }

感谢您的帮助

【问题讨论】:

  • 您发布的 C# 代码遇到什么问题?
  • 通常在这种情况下,您将使用递归 - 创建一个采用文件夹节点的函数。在该函数中,您处理其子节点 - 对于每个文件夹节点,您再次调用相同的函数。
  • C.Evenhuis,你有例子吗?我不知道具体怎么做!
  • Siva Gopal,我的代码运行良好,我想知道如何从文件夹节点动态获取值。因为这个节点可以有n个子节点

标签: c# xml parsing


【解决方案1】:

感谢 InvernoMuto,这是我在您的帮助下找到的解决方案

var inner = content.OuterXml;
        var xml = System.Xml.Linq.XDocument.Parse(inner);
        foreach (var fds in xml.Root.DescendantsAndSelf()) {
            Console.WriteLine (fds.Name.LocalName);
            if(fds.Name.LocalName != "content")
                Console.WriteLine ("Name {0}, Parent {1}", fds.Attribute("name").Value, fds.Parent.Attribute("name"));
        }

感谢大家的帮助

【讨论】:

    【解决方案2】:

    您可以使用 Linq to XML System.Xml.Linq.XDocument 获得您想要实现的目标,因为 xml.Descendants("file") 将返回文档中的每个 file 节点,你只需要做这样的事情:

    // since st is an XMLDocument
    var xml = XDocument.Parse(st.OuterXml);
        foreach (foreach (var file in xml.Descendants("file"))) 
        {
            var file = new OfflineGetCourseContentFile {
                Id = q.Id,
                File = file.Value
            };
            InsertSqliteDb.InsertIntoDB (file);
        }
    

    XContainer.Descendants 方法 (XName)

    为此返回一个过滤后的后代元素集合 文档或元素,按文档顺序。只有元素具有 匹配的 XName 包含在集合中。

    返回值类型:System.Collections.Generic.IEnumerable An XElement 的 IEnumerable 包含 与指定 XName 匹配的 XContainer。

    【讨论】:

    • 我的 xml 是来自服务器的文件。所以我使用 HttpClient 来获取 xml。并返回给我一个 XMLDocument。我不能使用你的解决方案,是吗?
    • 你可以简单地解析它:XDocument.Parse(doc.OuterXml) where doc is XMLDocument
    • 那么使用 XDocument.Parse 如何获取每个文件夹节点的项目名称?等他们的孩子节点?因为文件夹的节点可以有一个文件和/或另一个文件夹的节点...
    • 使用 XDocument 解析您将按名称、子节点而不是子节点获取每个节点,请阅读我编辑的答案
    • 感谢 InvernoMuto,这是我在您的帮助下找到的解决方案
    猜你喜欢
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多