2015-10-09 58 views
-1

我在通過C#中的xml字符串進行迭代時遇到了問題。在網上隨處看,但這些例子加載一個實際的.xml文件,而我試圖迭代字符串。在C中迭代XML字符串#

我有以下的方法,返回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); 
    } 
} 

結果回來都是一條線,而我想遍歷每個記錄和記錄的子節點。

+1

http://stackoverflow.com/q/55828/62576 –

+2

停止嘗試將XML解析爲字符串。使用DOM解析器,您可以輕鬆地使用節點並遍歷XML結構。 –

+0

欣賞模糊的答案。當我加載字符串atleast時,我能夠獲取數據,現在使用XmlDocument,我沒有收到任何東西,因此我首先使用該字符串。這些不是靜態的.xml文件,我正在向一個文件數據庫數據庫運行查詢,該數據庫返回一個XML響應 – user5120455

回答

0

您的代碼將遍歷所有record元素和只寫在所有子元素串接文本的價值。如果你想通過每個孩子的迭代個別節點,那麼你想要的東西,如:

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

這就是說,這可能是沒有多大用處的。據推測每個記錄中都有特定的數據要獲取?

-1

這是一個遞歸的方式來分析文件夾中的一堆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(); 
     } 
    } 
} 
+0

我不想分析文件夾中的文件。我做了一個webrequest,它返回一個XML字符串,我試圖迭代。 – user5120455

+0

只需將「string xml = doc.InnerXml;」用「string xml = YOUR XML STRING;」 – deathx91