2013-11-27 4 views
2

У меня есть следующий xml.Получить значения из xml с помощью regex

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. Я не могу этого сделать. Поэтому я хочу сделать это с помощью регулярного выражения. Можно ли удалить все остальное в строке, кроме результата с помощью regex.?

+3

Я думаю, что regex не лучший способ разбора xml. У вас есть все данные xml или только эти три строки? Вам не хватает некоторых открывающих тегов и определений пространства имен. –

+0

Это не весь xml. Я добавлю их сейчас. –

+0

Это все еще недействительный xml и даже не имеет тегов строк –

ответ

2

Таким образом, вы не имеете правильный XML здесь, вы можете рассматривать эту строку как HTML и разобрать его с HTMLAgilityPack (доступным от NuGet):

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

теги равны null .. Вывод XML-файла entie доступен здесь ..http : //pastebin.com/9K8GRZg0 –

+0

Попробуйте запустить '.Replace()' для удаления буквенных символов '\ r \ n' (' validXMLString.Replace ("\\ r \\ n", "") ') – Darkzaelus

+0

@Jinxed отлично работает с вашим xml, если вы удалите из него строку '\ r \ n' (я считаю, что у вас это из-за копирования-вставки из отладчика). Также у вас есть 'ItemCount = \" 8 \ "' экранированные кавычки –

0

Я обычно использую LINQ для извлечения значений из XML, это делает его намного проще.

Пример 1: LINQ to read XML

Пример 2: Я использую ниже, чтобы получить список Вопросы и ответы для викторины App

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

Я не могу подчеркнуть, как bad Идея состоит в том, чтобы извлекать значения из 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

Спасибо за этот кусок кода. Можно ли удалить все остальное из строки, сохранив только значения, чтобы избежать циклов. ?? –

Смежные вопросы