2015-08-21 2 views
0

У меня есть строка в виде XML с числом тегов:Как получить все имена ребенка элементов и значения внутри определенного элемента в XML-тег

<Code> 
<!-- Schema Version MQ Message blocks --> 
    <T_C_B> 
     < ATXYCB>ABC11</ ATXYCB> 
     <BTCWZB>EFG22</BTCWZB> 
     < CTATCB>IJK33</CTATCB> 
     < DTCAAB>LMN44</DTCAAB> 
     <!-- End T_C_B --> 
    </T_C_B> 

    <D_C_B> 
     < ADCB>xs:string</ ADCB> 
     < BDCB>xs:string</ BDCB> 
     < CDCB>xs:string</ CDCB> 
    <!-- End D_ C_B--> 
    </D_C_B> 
    <U_C_B> 
     <UATXYCB>AA2B</ UATXYCB> 
     <BUTCWZB>BB4C</BUTCWZB> 
     < UCTATCB>C8CD</UCTATCB> 
     < DTUCAAB>D9DE</DTUCAAB> 
    <!-- End U_C_B-> 
    </U_C_B> 
</Code> 

мне нужно найти элементы внутри T_C_B и U_C_B и их значения и объединить с делителем, подобным «|», :

ATXYCB = ABC11 | BTCWZB = EFG22 | CTATCB = IJK33 | DTCAAB = LMN44 | UATXYCB = AA2B | т.д ......»

Есть ли Regex или Xpath, которые могут быть использованы. .. ?? Или любые другие обходные

+0

ли комментарии и интервал точно так же в реальной жизни вход? '' не является допустимым комментарием. '' недействительный тег. –

ответ

0

Если у вас есть такой вход (с космическими вопросами и недействительных комментариями), я предлагаю 2 способа: основанные на XML и регулярные выражения (в качестве резервной копии).

XML путь

Она состоит в установлении проблем, которые мешают разбор с XElement и затем фактическим парсингом:

var xml = "<<YOUR_XML>>"; 
xml = Regex.Replace(xml, @"<\s+([\w:-])", "<$1"); 
xml = Regex.Replace(xml, @"</\s+([\w:-]+>)", "</$1"); 
xml = Regex.Replace(xml, @"(?s)<!--.*?->", string.Empty); 
XElement xe = null; 
try 
{ 
    xe = XElement.Parse(xml); 
    var tags = xe.DescendantsAndSelf() 
     .Where(p => p.Name == "T_C_B" || p.Name == "U_C_B") 
     .Select(p => new { names = p.Descendants() 
         .Select(m => m.Name.LocalName + "=" + m.Value) 
         .ToList() }) 
     .ToList(); 
    var res = string.Empty; 
    foreach (var s in tags) 
     res += (string.IsNullOrEmpty(res) ? "" : "|") + 
       string.Join("|", s.names); 
} 
catch(Exception e) 
{ 

} 

Regex путь

Вы можете использовать следующее регулярное выражение для обработки ваших данных:

<\s*[UT]_C_B\s*>(?:\s*<\s*(?<name>[^<]*)>(?<val>[^<]*)<\s*/\s*\k<name>>.*?)+ 

См. demo

C# Код:

var rx = new Regex(@"<\s*[UT]_C_B\s*>(?:\s*<\s*(?<name>[^<]*)>(?<val>[^<]*)<\s*/\s*\k<name>>.*?)+", RegexOptions.Singleline); 
var matchColl = rx.Matches(xml); 
var result = string.Empty; 
foreach (Match m in matchColl) 
{ 
    for(int y = 0; y < m.Groups["name"].Captures.Count; y++) 
     result += (string.IsNullOrEmpty(result) ? "" : "|") + 
      string.Format("{0}={1}", m.Groups["name"].Captures[y].Value, 
            m.Groups["val"].Captures[y].Value); 
} 

Оба подхода приводят к:

enter image description here

+0

Спасибо большое .. !!! @stribizhev .. Это сработало .. – Kuntal

+0

Пожалуйста, подумайте о принятии ответа, если он сработает для вас (отметьте слева внизу стрелку вниз). –

0

Вы можете использовать XML разбора с XDocument:

string str = ""; 
XDocument doc = XDocument.Load(filename); 
IEnumerable<XElement> elements = doc.Root.Elements(); 
foreach (XElement e in elements) 
{ 
    if ((e.Name == "T_C_B") || (e.Name == "U_C_B")) 
    { 
     IEnumerable<XElement> nextElmt = e.Elements(); 
     foreach (XElement x in nextElmt) 
     { 
       str += string.Format("{0}={1}", x.Name, x.Value); 
       str += "|"; 
     } 
    } 
} 

str = str.Remove(str.Length - 1, 1); 
Console.WriteLine(str); 

Вы можете попробовать его здесь: https://dotnetfiddle.net/kOudWl

+0

Если файл содержит те же ошибки, что и в примере ввода, перед обработкой с помощью 'XDocument' вам потребуется предварительная обработка. –

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