【问题标题】:Extract nodes data from xml从 xml 中提取节点数据
【发布时间】:2013-05-07 16:15:07
【问题描述】:

我有一个这样的 xml:

<People>
  <PersonID>5</PersonID>
  <PersonID>7</PersonID>
  <PersonID>9</PersonID>
</People>

我想创建一个包含所有 id 的字符串,例如:“5,7,9”。 我知道可以通过一个简单的循环来实现,但由于此代码每秒会调用 100 次,因此我想让它成为最快的方式。

我正在使用 C# 框架 4.0。

我当前的代码:

XmlDocument doc = new XmlDocument();
XmlNodeList nodeList;
StringBuilder strXml = new StringBuilder();
doc.LoadXml(sXmlQuery);
nodeList = doc.SelectNodes("//PersonID");
if (nodeList != null)
{
    foreach (XmlNode node in nodeList)
    {
        strXml.Append(node.InnerText.Trim());
        strXml.Append(",");
    }
}

【问题讨论】:

  • 显示您的代码,以便我们提出一些改进建议..
  • 试试 Linq to Xml?
  • alfdev - 你能举个例子吗?
  • 还是 XPath? stackoverflow.com/questions/5279786/performance-of-xpath-vs-dom - Michael Kay 答案非常好,从 XPath 和 DOM 之间的角度来看
  • 我认为您的代码已经接近最快的方法。我能提出的唯一建议是在if 的主体内创建StringBuilder,这样如果没有节点集就不会生成StringBuilder。 StringBuilder 中的字符串也将以逗号结尾。您需要去掉最后一个逗号。

标签: c# .net xml


【解决方案1】:

您可以将LINQ to XMLstring.Join 一起使用,例如:

XDocument xmlDoc = XDocument.Parse(@"<People>
                                      <PersonID>5</PersonID>
                                      <PersonID>7</PersonID>
                                      <PersonID>9</PersonID>
                                    </People>");
var val = xmlDoc.Descendants("People")
                 .SelectMany(r => r.Elements("PersonID"))
                 .Select(r => r.Value);
string str = string.Join(",", val);

str 将是 str = "5,7,9"

【讨论】:

  • 这看起来是个不错的方法,但是我不确定它是否比 OP 中的代码快。您是否有经验证明您的代码明显更快?
  • @Bazzz,不,我没有。问题的第一个版本没有可比较的代码行,我认为 OP 可以使用 Stopwatch 来衡量这两个代码的性能。
  • Habib,请注意我无意冒犯,您的代码完全有效。我只是注意到 OP 明确要求提高性能,我只是指出您的代码可能并不比 OP 后来添加的代码快。您使用Stopwatch 的建议可能是找到最快方法的好方法。
  • 感谢 Habib 和 Bazzz 的帮助。
  • @Bazzz,我没有冒犯 :),对不起,如果我听起来很粗鲁
【解决方案2】:

我不知道它对你来说是否足够快,但我会试一试

string s = String.Join("," , xDoc.Descendants("PersonID").Select(p => (string)p));

【讨论】:

    【解决方案3】:

    试试下面的代码:

     public DataTable GetColumnsFromXML(String XMLPath, String TableName)
    {
        DataTable dtForColumns = DatatableforColumns();
        XmlDataDocument xmldoc = new XmlDataDocument();
        xmldoc.Load(XMLPath);
        XmlElement root = xmldoc.DocumentElement;
        XmlNodeList tablenodes = root.SelectNodes("Table");
    
        if (tablenodes != null)
    
            foreach (XmlNode nodes in tablenodes)
            {
                if (!nodes.HasChildNodes) continue;
                if (nodes.Attributes == null) continue;
                //TableName = nodes.Attributes[0].Value;
    
                if (nodes.Attributes[0].Value == TableName)
                {
                    String PrimaryKey = nodes.Attributes[1].Value;
                    var nodesdisplayname = nodes.SelectNodes("Column/DisplayColumn");
                    var nodesorignalvalue = nodes.SelectNodes("Column/OrignalColumn");
    
                    if (nodesdisplayname != null && nodesorignalvalue != null)
                    {
                        for (int i = 0; i <= nodesdisplayname.Count - 1; i++)
                        {
                            var xmlDisplayNode = nodesdisplayname.Item(i);
                            var xmlOrignalNode = nodesorignalvalue.Item(i);
    
    
                            if (xmlDisplayNode != null && xmlOrignalNode != null)
                            {
    
                                DataRow dr;
                                dr = dtForColumns.NewRow();
                                dr["DisplayColumn"] = xmlDisplayNode.InnerText;
                                dr["OrignalColumn"] = xmlOrignalNode.InnerText;
                                dr["PrimaryKey"] = PrimaryKey;
                                dtForColumns.Rows.Add(dr);
                            }
                        }
                    }
                }
            }
        return dtForColumns;
    }
    private DataTable DatatableforColumns()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("DisplayColumn", typeof(String));
        dt.Columns.Add("OrignalColumn", typeof(String));
        dt.Columns.Add("PrimaryKey", typeof(String));
        return dt;
    }
    

    要访问这些是代码:

    DataTable dtColumns = new DataTable();        
    dtColumns = objXML.GetColumnsFromXML(Server.MapPath("~/XMLFile.xml"), TableName);
    

    根据您的要求自定义它,希望这对您有用。

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多