2016-12-23 7 views
0

я строка, которая имеет XML-тег, какИзвлечение значения XML в нанизывать C#

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<lab:lab xmlns:udf="http://ghjhjhj.com/ri/userdefined" 
     xmlns:ri="http://kjkj.com/ri" 
     xmlns:lab="http://iuiuu.com/ri/lab" 
     uri="https://hhjjhjhj.org/api/v2/labs/1"> 
    <name>Administrative Lab</name> 
    <billing-address> 
     <street></street> 
     <city></city> 
     <state></state> 
     <country></country> 
     <postalCode></postalCode> 
     <institution></institution> 
     <department></department> 
    </billing-address> 
    <shipping-address> 
     <street></street> 
     <city></city> 
     <state></state> 
     <country></country> 
     <postalCode></postalCode> 
     <institution></institution> 
     <department></department> 
    </shipping-address> 
    <udf:field type="String" name="Account ID">adm</udf:field> 
    <website></website> 
</lab:lab>" 

Для того, чтобы просто извлечь значение ADM т.е. любого значения между <udf> тегом я должен использовать в XDocument или XmlDocument.I понимаю, что я могу использовать XDocument.Parse, но это я не уверен, как дать имя тега. Я попытался ниже

XDocument new_doc = XDocument.Parse(new_responseString); 
    var a = from udf in new_doc.Descendants("udf") select udf.Value; 

Но могут быть дополнительные UDF поля в будущем, так что я буду проверять должно быть имя = «Account ID», и я не знаю, как это сделать

Как я могу получить это?

+0

Можете ли вы поделиться своим полным XML или b igger часть его и что вы пробовали до сих пор? –

+0

Возможный дубликат. См. Этот [ответ] (http://stackoverflow.com/questions/18230605/how-to-parse-xml-with-namespace). Надеюсь это поможет. – Pratyay

+0

@MohitShrivastava Я отредактировал всю строку. Я понимаю, что могу использовать XDocument.Parse, но я не уверен, как дать имя тега – Sid

ответ

2

Метод Attribute для извлечения значения атрибута XElement.

var udf = "http://ghjhjhj.com/ri/userdefined"; 
var new_doc = XDocument.Parse(new_responseString); 
var fieldValues = doc.Descendants(udf + "field") 
        .Where(field => field.Attribute("name").Value.Equals("Account ID")) 
        .Select(field => field.Value); 

foreach (var value in fieldValues) 
{ 
    Console.WriteLine(value); 
} 

Если вам нужно только одно значение, то используйте FirstOrDefault метод

var fieldValue = 
    doc.Descendants(udf + "field") 
     .FirstOrDefault(field => field.Attribute("name").Value.Equals("Account ID")) 
     .Value; 

Но знайте - этот запрос будет бросать исключение из там без каких-либо элементов с атрибутом name = "Account ID"

+0

Спасибо, Фабио. Но как преобразовать udfValues ​​в строку. – Sid

+0

@Sid - 'udfValues' имеет тип' IEnumerable '. Если вы ожидаете только одного значения, добавьте запрос после метода 'Select' -' FirstOrDefault() '. – Fabio

+0

В нем говорится, что 'Non-invocable member 'System.Xml.Linq.XElement.Value' не может использоваться как метод.' В '.Value();' – Sid

1

Вероятно, это может сделать трюк для вас

XNamespace laburi = "http://iuiuu.com/ri/lab"; 
XNamespace udfuri = "http://ghjhjhj.com/ri/userdefined"; 
XDocument xdoc = XDocument.Load("some.txt"); 
var a = xdoc.Elements(laburi + "lab").Elements(udfuri + "field").FirstOrDefault().Value;