2013-11-27 37 views
2

我有以下xml。使用正則表達式從xml中獲取值

string xmlstring= <z:row ows_Article_x0020_Tags='14;#cricket;#21;#Headlines;#19;#Videos' ows__ModerationStatus='0'  ows__Level='1' ows_Last_x0020_Modified='9;#2013-11-26 01:33:01' ows_ID='9' ows_UniqueId='9;#{FEA534D1-F63B-464D-97DE-  AC60798B72D6}' ows_owshiddenversion='9' ows_FSObjType='9;#0' ows_Created_x0020_Date='9;#2013-11-24 22:59:53' ows_ProgId='9;#' ows_FileLeafRef='9;#Pablo-Ferrero.aspx' ows_PermMask='0x7fffffffffffffff' ows_Modified='2013-11-26  01:33:01' ows_FileRef='9;#sites/Gaslines/NewsAndEvents/Pages/Pablo-Ferrero.aspx' ows_DocIcon='aspx'  ows_Editor='24;#Harshini P Hegde' />\r\n 
<z:row ows_Article_x0020_Tags='20;#Charity;#14;#cricket' ows__ModerationStatus='0' ows__Level='1' ows_Last_x0020_Modified='10;#2013-11-26 01:30:11' ows_ID='10' ows_UniqueId='10;#{C8D042AE-466F-44E8-940B- 0C9A64130923}' ows_owshiddenversion='8' ows_FSObjType='10;#0' ows_Created_x0020_Date='10;#2013-11-24 23:01:50' ows_ProgId='10;#' ows_FileLeafRef='10;#Debra-L-Reed.aspx' ows_PermMask='0x7fffffffffffffff' ows_Modified='2013-11- 26 01:3:10' ows_FileRef='10;#sites/Gaslines/NewsAndEvents/Pages/Debra-L-Reed.aspx' ows_DocIcon='aspx' ows_Editor='24;#Harshini P Hegde' />\r\n 
<z:row ows_Article_x0020_Tags='' ows__ModerationStatus='3' ows__Level='255' ows_Last_x0020_Modified='13;#2013-11-26  01:45:12' ows_ID='13' ows_UniqueId='13;#{81236BD1-AF3B-4D97-BA14-5492F8013251}' ows_owshiddenversion='5' ows_FSObjType='13;#0' ows_Created_x0020_Date='13;#2013-11-26 01:28:45' ows_ProgId='13;#' ows_FileLeafRef='13;#TestTagCloudPage.aspx' ows_PermMask='0x7fffffffffffffff' ows_Modified='2013-11-26 01:45:13' ows_CheckoutUser='24;#Harshini P Hegde' ows_FileRef='13;#sites/Gaslines/NewsAndEvents/Pages/TestTagCloudPage.aspx' ows_DocIcon='aspx' ows_Editor='24;#Harshini P Hegde' />\r\n</rs:data>\r\n</xml>" 

上面的XML也有stringxml之前以下

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'\r\n  xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'\r\n  xmlns:rs='urn:schemas-microsoft-com:rowset'\r\n  xmlns:z='#RowsetSchema'>\r\n 
<s:Schema id='RowsetSchema'>\r\n 
<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>\r\n  
<s:AttributeType name='ows_Article_x0020_Tags' rs:name='Article Tags' rs:number='1'>\r\n   

我需要輸出作爲

string result= 14;#cricket;#21;#Headlines;#19;#Videos;20;#Charity;#14;#cricket 

即我需要的TXT躺在

之間
`<z:row ows_Article_x0020_Tags=" and " ows__ModerationStatus=` 

我試過用linq。我無法做到這一點。所以我想用正則表達式來做。是否有可能刪除字符串中除了使用正則表達式的結果之外的所有其他內容?

+3

我認爲正則表達式不是解析xml的最佳方式。你有所有的XML數據,或只有這三行?你缺少一些開始標籤和名稱空間定義 –

+0

這不是整個XML,我現在將它們添加。 –

+0

這仍然是無效的XML,它甚至沒有行標記 –

回答

2

因此你沒有有效的XML在這裏,你可以把這個字符串作爲html和(來自的NuGet可)與HTMLAgilityPack解析它:

HtmlDocument hdoc = new HtmlDocument(); 
hdoc.LoadHtml(xmlstring); 
var tags = hdoc.DocumentNode.Descendants() 
       .Select(r => r.GetAttributeValue("ows_Article_x0020_Tags", "")); 

string result = String.Join("", tags); 
// 14;#cricket;#21;#Headlines;#19;#Videos20;#Charity;#14;#cricket 

隨着解析有效的XML推薦的工具是LINQ到XML 。解析應該看起來像:

XDocument xdoc = XDocument.Parse(validXmlString); 
XNamespace z = "#RowsetSchema"; 
var tags = xdoc.Descendants(z + "row") 
       .Select(r => (string)r.Attribute("ows_Article_x0020_Tags")); 
+0

標記爲空。該entie XML輸出可here..http ://pastebin.com/9K8GRZg0 –

+0

嘗試運行一個'.Replace()'以除去字面'\ r \ N'字符('validXMLString.Replace( 「\\ř\\ N」, 「」)') – Darkzaelus

+0

@Jinxed在你的xml中工作得很好,如果你將從中刪除'\ r \ n'字符串(我相信你是從複製粘貼到調試器的)。你也有'ItemCount中= \「8 \」'轉義引號 –

0

我通常使用LINQ從XML中獲取值,這使得它更容易。

例1:LINQ to read XML

例2:我用下面讓問題和答案的列表測驗應用

public List<QuizQuestions> GetQuiz(int level) 
    { 
     string docName = "DataModel/Level" + level.ToString() + ".xml"; 
     XDocument xdoc = XDocument.Load(docName); 
     List<QuizQuestions> book = (from list in xdoc.Descendants("Question") 
            select new QuizQuestions(list.Element("Quest").Value 
                  , list.Element("A").Value 
                  , list.Element("B").Value 
                  , list.Element("C").Value 
                  , list.Element("D").Value 
                  , list.Element("Answer").Value) 
                  ).OrderBy(a => Guid.NewGuid()).ToList(); 
     return book; 
    } 

UPDATE:這將有效的XML只工作

1

我不能強調如何不好一個想法,它是從正則表達式提取xml值,但如果你真的想這應該工作:

 Regex regex = new Regex("ows_Article_x0020_Tags='([^']*)'"); 
     var matches = regex.Matches(xmlstring); 
     Console.WriteLine(matches[0].Groups[1].Value); 
     Console.WriteLine(matches[1].Groups[1].Value); 
+0

謝謝你的這段代碼。是否可以通過只保留值來避免循環,從字符串中刪除其他所有內容。 –