在 C# 中迭代​​一个 XML 字符串

Iterating an XML String in C#

我在 C# 中迭代​​ xml 字符串时遇到问题。在网上到处查看,但示例加载了实际的 .xml 文件,而我只是尝试迭代字符串。

我有以下方法 returns XML 作为字符串

public static string WRequest(string URL, string method, string postData)
{}

在另一种方法中,我想获取结果并迭代字符串。

public void do_xmlIterate()
{
    string result = WRequest(query, "GET", "");
    //At this point I get the XML string back.
    XDocument doc = XDocument.Parse(result);
    var root=doc.Root;
    var root_desc = root.Descendants("{http://www.filemaker.com/xml/fmresultset}record");

    foreach(var item in root_desc)
    {
        Console.WriteLine(item.value);
    }
}

结果全部返回一行..而我想遍历每条记录和记录子节点。

这是一种分析文件夹中一堆 XML 文件的递归方法。

protected void btnProcessFiles_Click(object sender, EventArgs e)
{
    objDAO.SqlExec("SP_CLEAN");

    DirectoryInfo di = new DirectoryInfo(ConfigurationManager.AppSettings["XMLDir"]);

    foreach (FileInfo fl in di.GetFiles())
    {
        XmlDocument doc = new XmlDocument();
        doc.Load(ConfigurationManager.AppSettings["XMLDir"] + fl.Name);

        string xml = doc.InnerXml;

        byte[] encodedString = Encoding.UTF8.GetBytes(xml);

        MemoryStream ms = new MemoryStream(encodedString);
        ms.Flush();
        ms.Position = 0;

        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(ms);

        XmlElement element = xmlDoc.DocumentElement;

        XmlNodeList nodes = element.ChildNodes;

        registerId = objDAO.SqlCall("SELECT NEWID()").Rows[0][0].ToString();


        XMLElementAnalyzer(nodes, "1", objDAO.SqlCall("SP_ADD_VALUE '" + registerId + "','1','1',1,'00000000-0000-0000-0000-000000000000'").Rows[0][0].ToString(), 1);

        registerId = String.Empty;

        if (new FileInfo(ConfigurationManager.AppSettings["XMLDir"] + "Done\" + fl.Name).Exists)
        {
            new FileInfo(ConfigurationManager.AppSettings["XMLDir"] + "Done\" + fl.Name).Delete();
            fl.MoveTo(ConfigurationManager.AppSettings["XMLDir"] + "Done\" + fl.Name);
        }
        else
        {
            fl.MoveTo(ConfigurationManager.AppSettings["XMLDir"] + "Done\" + fl.Name);
        }
    }
}

public void XMLElementAnalyzer(XmlNodeList nodes, String parent, String parentId, int instance)
{
    String lastNode = String.Empty;
    String id = String.Empty;

    foreach (XmlNode node in nodes)
    {
        if (lastNode.Equals(String.Empty))
        {
            lastNode = node.Name;
        }
        else
        {
            instance += (node.Name.Equals(lastNode) ? 1 : 0);
        }

        String nodeId = String.Empty;

        if (!node.Name.Equals("#text"))
        {
            dt = objDAO.SqlCall("SP_CHECK_NODE '" + node.Name + "','" + parent + "'");

            if (dt.Rows.Count == 0)
            {
                nodeId = objDAO.SqlCall("SP_ADD_NODE '" + node.Name + "','" + parent + "'").Rows[0][0].ToString();
            }
            else
            {
                nodeId = dt.Rows[0][0].ToString();
            }
        }

        if (node.Attributes != null && node.Attributes.Count > 0)
        {
            id = objDAO.SqlCall("SP_ADD_VALUE '" + registerId + "','" + nodeId + "','" + nodeId + "'," + instance.ToString() + ",'" + parentId + "'").Rows[0][0].ToString();

            String attrId = String.Empty;

            foreach (XmlAttribute attr in node.Attributes)
            {
                dt = objDAO.SqlCall("SP_CHECK_NODE '" + attr.Name + "','" + nodeId + "'");

                if (dt.Rows.Count == 0)
                {
                    attrId = objDAO.SqlCall("SP_ADD_NODE '" + attr.Name + "','" + nodeId + "'").Rows[0][0].ToString();
                }
                else
                {
                    attrId = dt.Rows[0][0].ToString();
                }

                objDAO.SqlCall("SP_ADD_VALUE '" + registerId + "','" + attrId + "','" + attr.Value + "'," + instance.ToString() + ",'" + id + "'").Rows[0][0].ToString();
            }
        }

        if (node.Name.Equals("#text"))
        {
            id = objDAO.SqlCall("SP_ADD_VALUE '" + registerId + "','" + parent + "','" + node.Value + "'," + instance.ToString() + ",'" + parentId + "'").Rows[0][0].ToString();
        }

        if (node.ChildNodes.Count > 0)
        {
            if (node.Attributes == null || node.Attributes.Count == 0)
                id = objDAO.SqlCall("SP_ADD_VALUE '" + registerId + "','" + nodeId + "','" + nodeId + "'," + instance.ToString() + ",'" + parentId + "'").Rows[0][0].ToString();
            XMLElementAnalyzer(node.ChildNodes, nodeId, id, instance);
        }

        if (node.InnerText.Equals("") && node.Attributes.Count == 0 && node.ChildNodes.Count == 0)
        {
            objDAO.SqlCall("SP_ADD_VALUE '" + registerId + "','" + nodeId + "','" + nodeId + "'," + instance.ToString() + ",'" + parentId + "'").Rows[0][0].ToString();
            objDAO.SqlCall("SP_ADD_VALUE '" + registerId + "','" + nodeId + "',''," + instance.ToString() + ",'" + parentId + "'").Rows[0][0].ToString();
        }
    }
}

您的代码将迭代所有 record 元素,并仅在所有子元素中写入串联文本的值。如果你想单独遍历每个子节点,那么你需要这样的东西:

Namespace fmr = "http://www.filemaker.com/xml/fmresultset"
var results = doc.Descendants(fmr + "record").Descendants();

也就是说,这可能没那么有用。想必你要获取的每条记录里面都有具体的数据吧?