2016-06-13 52 views
0

初學C#人在這裏,我一直在摔跤特定的場景,我想你的幫助。我需要處理每次閱讀時其內容可能不同的XML文件。每次我閱讀該文檔時,都需要在特定元素內搜索特定屬性。這些特定元素和屬性的組成可能因文件而異。我已經成功地閱讀了這個元素中的單個元素和單個屬性,使用了我在這個論壇上發現的使用Linq到XML的例子。請參閱下面的例子,瞭解我正在使用的XML。C#從特定元素檢索多個XML屬性進行操作

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 wp14"> 
    <w:body> 
     <w:p w14:paraId="2CBBB1B4" w14:textId="77777777" w:rsidR="00D9548A" w:rsidRDefault="00D9548A" w:rsidP="00ED7A0B"></w:p> 
     <w:p w14:paraId="2CBBB1B5" w14:textId="77777777" w:rsidR="00ED548A" w:rsidRPr="00ED77B9" w:rsidRDefault="00C706DD" w:rsidP="00D9548A"></w:p> 
     <w:pPr> 
      <w:rPr> 
       <w:rFonts w:ascii="Arial" w:hAnsi="Arial" w:cs="Arial"></w:rFonts> 
       <w:b></w:b> 
       <w:sz w:val="40"></w:sz> 
       <w:szCs w:val="40"></w:szCs> 
      </w:rPr> 
     </w:pPr> 
     <w:r w:rsidRPr="00cool6F"></w:r> 
     <w:tr w:rsidR="0029258E" w14:paraId="2CBBB242" w14:textId="77777777" w:rsidTr="0029258E"></w:tr> 
    </w:body> 
</w:document> 

有趣元件將是 'W:P', 'W:R', 'W:TR' 或幾乎具有任何以下屬性的任何元素:wrsidR,wrsidRDefault,wrsidRPr,rsidTr。

理想情況下,我想要一種方式將這些值中的每一個讀入某種list \ array中,以便我可以更改這些值並將這些值寫回到我從中獲取的屬性。

我拼湊在一起的代碼僅從文件中的'w:p'元素返回1個屬性'rsidR'。

public static void foobar() 
    { 
     string strFile = @"C:\SourceFolder\SampleXML\document-test.xml"; 
     XDocument xDoc = XDocument.Load(strFile); 
     XNamespace xNsp = xDoc.Root.Name.Namespace; 

     var values = from rsids in xDoc.Descendants(xNsp + "p").Attributes(xNsp + "rsidR") 
        select rsids.Value.ToString(); 

     foreach (var v in values) 
     { 
      Console.WriteLine(v); 
     } 
    } 

是什麼都在這個文件中的有趣的屬性值後去,這樣我可以遍歷它們,改值,並將其寫回XML文件的最好方法?

一如既往,我非常感謝您的幫助!

回答

0
After you load the document in XmlDocument available in using System.Xml 
namespace, you can create mutliple XmlNodeList(s) and then fetch the values. 

     public static void foobar() 
     { 
      string strFile = @"C:\SourceFolder\SampleXML\document-test.xml"; 
      XmlDocument doc = XmlDocument.Load(strFile); 

      if (doc.SelectSingleNode("w:body") != null) 
      { 
       XmlNodeList nodes = doc.SelectNodes(".//w:pPr"); 
       foreach (XmlNode xn in nodes) 
       { 
        XmlNodeList rPr = xn.SelectNodes("w:rPr"); 
        foreach (XmlNode xnrPr in rPr) 
        { 
         if (xnrPr.SelectSingleNode("w:rFonts") != null) 
         { 
          Console.WriteLine(xnrPr.SelectSingleNode("w:rFonts").InnerText.ToString()); 
         } 
        } 
       } 
      } 
+0

嗨 - 感謝您的建議,但我不認爲這是處理在XML文件中明顯的名稱空間。它試圖執行此代碼時會拋出以下錯誤「名稱空間管理器或XsltContext需要,此查詢具有前綴,變量或用戶定義的函數。」 –

+0

此外 - 我認爲這個代碼取決於我提前知道XML文檔的結構...不幸的是,我不會,也不會。唯一確定的是至少有一個或多個有趣的屬性將存在於文檔中。元素組成將會變化,屬性的出現也會不同。 –

+0

如果您不知道確切的結構,但您至少知道您感興趣的節點/屬性的名稱,則可以使用XPath。警告 - 您可能遇到了您不想要的節點。 –

0

這醜陋的代碼似乎做我想做的事情。我非常樂意接受的任何代碼精簡\高效片裏面做同樣的事情。要解決的突出問題是:

1)獲取屬性的值 2)將屬性值聚合成一個我可以迭代的數組。

public static void shaqfoo() 
    { 
     string strFile = @"C:\SourceFolder\SampleXML\document (3).xml"; 
     using (XmlReader reader = XmlReader.Create(strFile)) 
     { 
      while (reader.Read()) 
      { 
       if (reader.IsStartElement()) 
       { 
        switch (reader.Name) 
        { 
         case "w:p": 

          string wp_rsidRAttrib = reader["w:rsidR"]; 
          string wp_rsidRDefaultAttrib = reader["w:rsidRDefault"]; 
          string wp_rsidPAttrib = reader["w:rsidP"]; 
          string wp_rsidRPrAttrib = reader["w:rsidRPr"]; 
          string wp_rsidTrAttrib = reader["w:rsidTr"]; 

          if (wp_rsidRAttrib != null) 
          { 
           Console.WriteLine("w:p : w:rsidR : {0}", wp_rsidRAttrib); 
          } 
          if (wp_rsidRDefaultAttrib != null) 
          { 
           Console.WriteLine("w:p : w:rsidRDefault : {0}", wp_rsidRDefaultAttrib); 
          } 
          if (wp_rsidPAttrib != null) 
          { 
           Console.WriteLine("w:p : w:rsidP : {0}", wp_rsidPAttrib); 
          } 
          if (wp_rsidRPrAttrib != null) 
          { 
           Console.WriteLine("w:p : w:rsidRPr : {0}", wp_rsidRPrAttrib); 
          } 
          if (wp_rsidTrAttrib != null) 
          { 
           Console.WriteLine("w:p : w:rsidTr : {0}", wp_rsidTrAttrib); 
          } 
          break; 

         case "w:r": 

          string wr_rsidRAttrib = reader["w:rsidR"]; 
          string wr_rsidRDefaultAttrib = reader["w:rsidRDefault"]; 
          string wr_rsidPAttrib = reader["w:rsidP"]; 
          string wr_rsidRPrAttrib = reader["w:rsidRPr"]; 
          string wr_rsidTrAttrib = reader["w:rsidTr"]; 

          if (wr_rsidRAttrib != null) 
          { 
           Console.WriteLine("w:r : w:rsidR : {0}", wr_rsidRAttrib); 
          } 
          if (wr_rsidRDefaultAttrib != null) 
          { 
           Console.WriteLine("w:r : w:rsidRDefault : {0}", wr_rsidRDefaultAttrib); 
          } 
          if (wr_rsidPAttrib != null) 
          { 
           Console.WriteLine("w:r : w:rsidP : {0}", wr_rsidPAttrib); 
          } 
          if (wr_rsidRPrAttrib != null) 
          { 
           Console.WriteLine("w:r : w:rsidRPr : {0}", wr_rsidRPrAttrib); 
          } 
          if (wr_rsidTrAttrib != null) 
          { 
           Console.WriteLine("w:r : w:rsidTr : {0}", wr_rsidTrAttrib); 
          } 
          break; 

         case "w:tr": 

          string wtr_rsidRAttrib = reader["w:rsidR"]; 
          string wtr_rsidRDefaultAttrib = reader["w:rsidRDefault"]; 
          string wtr_rsidPAttrib = reader["w:rsidP"]; 
          string wtr_rsidRPrAttrib = reader["w:rsidRPr"]; 
          string wtr_rsidTrAttrib = reader["w:rsidTr"]; 

          if (wtr_rsidRAttrib != null) 
          { 
           Console.WriteLine("w:tr : w:rsidR : {0}", wtr_rsidRAttrib); 
          } 
          if (wtr_rsidRDefaultAttrib != null) 
          { 
           Console.WriteLine("w:tr : w:rsidRDefault : {0}", wtr_rsidRDefaultAttrib); 
          } 
          if (wtr_rsidPAttrib != null) 
          { 
           Console.WriteLine("w:tr : w:rsidP : {0}", wtr_rsidPAttrib); 
          } 
          if (wtr_rsidRPrAttrib != null) 
          { 
           Console.WriteLine("w:tr : w:rsidRPr : {0}", wtr_rsidRPrAttrib); 
          } 
          if (wtr_rsidTrAttrib != null) 
          { 
           Console.WriteLine("w:tr : w:rsidTr : {0}", wtr_rsidTrAttrib); 
          } 
          break; 

         case "w:sectPr": 

          string wsPr_rsidRAttrib = reader["w:rsidR"]; 
          string wsPr_rsidRDefaultAttrib = reader["w:rsidRDefault"]; 
          string wsPr_rsidPAttrib = reader["w:rsidP"]; 
          string wsPr_rsidRPrAttrib = reader["w:rsidRPr"]; 
          string wsPr_rsidTrAttrib = reader["w:rsidTr"]; 

          if (wsPr_rsidRAttrib != null) 
          { 
           Console.WriteLine("w:sectPr : w:rsidR : {0}", wsPr_rsidRAttrib); 
          } 
          if (wsPr_rsidRDefaultAttrib != null) 
          { 
           Console.WriteLine("w:sectPr : w:rsidRDefault : {0}", wsPr_rsidRDefaultAttrib); 
          } 
          if (wsPr_rsidPAttrib != null) 
          { 
           Console.WriteLine("w:sectPr : w:rsidP : {0}", wsPr_rsidPAttrib); 
          } 
          if (wsPr_rsidRPrAttrib != null) 
          { 
           Console.WriteLine("w:sectPr : w:rsidRPr : {0}", wsPr_rsidRPrAttrib); 
          } 
          if (wsPr_rsidTrAttrib != null) 
          { 
           Console.WriteLine("w:sectPr : w:rsidTr : {0}", wsPr_rsidTrAttrib); 
          } 
          break; 
        } 
       } 
      } 
     } 
    }