2

我有一个这样的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(",");
    }
}
4

3 回答 3

4

您可以将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"

于 2013-05-07T08:01:18.983 回答
1

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

string s = String.Join("," , xDoc.Descendants("PersonID").Select(p => (string)p));
于 2013-05-07T08:07:18.950 回答
0

试试下面的代码:

 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);

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

于 2013-05-07T08:15:07.047 回答