Mohammad Azeem Ответов: 3

Извлечение данных из XML


Привет,

У меня был следующий XML-файл, не могли бы Вы посоветовать, как я могу получить значение для поля в XML под названием ID_NUMERIC, то есть 711355..

Я получаю этот XML-файл в строковом поле.

Идентификатор поля останется постоянным, поэтому, если это возможно, как я могу получить его непосредственно по имени поля. Я выделил необходимые данные жирным шрифтом в следующем коде . Пожалуйста, посоветуйте.

<?xml version="1.0" encoding="utf-8"?><limsaaaml xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://sssssss">
<header>
<parameter name="SESSION">    209103</parameter>
</header>

<body>
<transaction id="TRAN1"><system response_type="system"><entity type="SAMPLE"><actions><action><command>CREATE</command><parameter name="TEMPLATE">AZEEM</parameter></action></actions>
<fields>
<field id="AREA" direction="in" datatype="Text">XXXX</field>
<field id="SSSSS" direction="in" datatype="Text">TFFFLE</field>
<field id="CFFFY" direction="in" datatype="Text">TLsss-0</field>
<field id="POINT" direction="in" datatype="Text">ssssse-110</field>
<field id="LssAsssB" direction="in" datatype="Text">saasdad</field>
<field id="s_DATE" direction="in" datatype="Date">9/17/2018 12:31:10 AM</field>
<field id="PRIORITY" direction="in" datatype="Text">3</field>
<field id="REASON" direction="in" datatype="Text">Reason</field>
<field id="COLLECTED" direction="in" datatype="Text">asdasad</field>
<field id="RI" direction="in" datatype="Text">hhhhhh</field>
<field id="dddddd" direction="in" datatype="Text">asdasda</field>
<field id="SCOMMENTS" direction="in" datatype="Text">COMMENTS</field>
<field id="AscaeeeDddddUCT" direction="in" datatype="Text">Bla</field>
<field id="ID_NUMERIC" direction="out" datatype="Text">    711355</field>
</fields><children><entity type="TEST"><actions /><fields>
<field id="Hut" direction="in" datatype="Text">Base</field>
<field id="COMPONENT_LIST" direction="in" datatype="Text">D</field>

</fields><children />
</entity></children></entity></system>
</transaction></body><errors /></limsaaaml>


Мазим

Что я уже пробовал:

Сгенерированный XML и сохранение его в строковой переменной

3 Ответов

Рейтинг:
2

Mohammad Azeem

Hi, 

Just last thing in XML i also had a node in XML somewhere like:

<STATUS>V</STATUS>

I am trying to get the value in string with the following code but its giving error am i missing something thanks. 

<pre>string ID= (Regex.Matches(ProcessedXML, "(?<=<STATUS> )(.*?)(?=</STATUS>)")[0]).ToString();


Bryian Tan

Пожалуйста, приложите к комментарию или исходному сообщению вместо публикации в качестве решения. Кстати, убедитесь, что статус прописной, потому что они чувствительны к регистру и удаляют лишнее пространство в регулярном выражении.

string ID= (Regex.Matches(ProcessedXML, "(?<=<STATUS>)(.*?)(?=</STATUS>)")[0]).ToString();

Рейтинг:
17

Bryian Tan

Основываясь на том, что опубликовано здесь, поскольку ваш код уже преобразует XML в строку, вы подумали об использовании регулярного выражения? Вот пример с предположением, что строка, обернутая вокруг ID_NUMERIC, всегда идентична и только одна ID_NUMERIC на XML.

string sampleXmlText= "<field id=\"AscaeeeDddddUCT\" direction=\"in\" datatype=\"Text\">Bla</field><field id=\"ID_NUMERIC\" direction=\"out\" datatype=\"Text\">    711355</field></fields><children><entity type=\"TEST\"><actions /><fields>";
		
		Console.WriteLine(Regex.Matches(sampleXmlText,  "(?<=<field id=\"ID_NUMERIC\" direction=\"out\" datatype=\"Text\"> )(.*?)(?=</field>)")[0]);

Выход: 711355


Maciej Los

5ed!

Рейтинг:
0

Maciej Los

Есть несколько способов достичь этого. :
1. Использование XmlSerialization[^] и XmlDeserialization
2. Использование Класс XDocument[^]
3. Использование класс XmlDocument[^]

Взгляните на приведенный ниже код (использование XDocument класс):

string xmlcontent = @"<?xml version='1.0' encoding='utf-8'?>
<limsaaaml xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://sssssss'>
<header>
	<parameter name='SESSION'>    209103</parameter>
</header>
<body>
<transaction id='TRAN1'>
<system response_type='system'>
<entity type='SAMPLE'>
<actions>
	<action>
		<command>CREATE</command>
		<parameter name='TEMPLATE'>AZEEM</parameter>
	</action>
</actions>
<fields>
	<field id='AREA' direction='in' datatype='Text'>XXXX</field>
	<field id='SSSSS' direction='in' datatype='Text'>TFFFLE</field>
	<field id='CFFFY' direction='in' datatype='Text'>TLsss-0</field>
	<field id='POINT' direction='in' datatype='Text'>ssssse-110</field>
	<field id='LssAsssB' direction='in' datatype='Text'>saasdad</field>
	<field id='s_DATE' direction='in' datatype='Date'>9/17/2018 12:31:10 AM</field>
	<field id='PRIORITY' direction='in' datatype='Text'>3</field>
	<field id='REASON' direction='in' datatype='Text'>Reason</field>
	<field id='COLLECTED' direction='in' datatype='Text'>asdasad</field>
	<field id='RI' direction='in' datatype='Text'>hhhhhh</field>
	<field id='dddddd' direction='in' datatype='Text'>asdasda</field>
	<field id='SCOMMENTS' direction='in' datatype='Text'>COMMENTS</field>
	<field id='AscaeeeDddddUCT' direction='in' datatype='Text'>Bla</field>
	<field id='ID_NUMERIC' direction='out' datatype='Text'>    711355</field>
</fields>
<children>
	<entity type='TEST'><actions />
	<fields>
		<field id='Hut' direction='in' datatype='Text'>Base</field>
		<field id='COMPONENT_LIST' direction='in' datatype='Text'>D</field>
	</fields>
<children />
</entity>
</children>
</entity>
</system>
</transaction>
</body>
<errors/>
</limsaaaml>";


XDocument xdoc = XDocument.Load(XmlReader.Create(new StringReader(xmlcontent)));
XNamespace s = "http://sssssss";
var f = xdoc.Descendants(s + "field").Where(x=>(string)x.Attribute("id")=="ID_NUMERIC").SingleOrDefault().Value.Trim();
Console.WriteLine("{0}", f);
//prints: 711355


Для получения более подробной информации, пожалуйста, смотрите: Как найти одного потомка с помощью метода потомков (C#)


Bryian Tan

Приятно! Почему бы мне не подумать об этом :)

Maciej Los

Спасибо, Брайан.

Richard Deeming

.SingleOrDefault().Value.Trim()


SingleOrDefault будет возвращать null если нет совпадающих элементов. В этом случае вызов к .Value бросил бы а NullReferenceException- Тебе, наверное, захочется ... оператор[^] туда.

Вы также можете комбинировать Where и SingleOrDefault в один звонок:
var f = xdoc.Descendants(s + "field").SingleOrDefault(x => (string)x.Attribute("id") == "ID_NUMERIC")?.Value?.Trim();

Maciej Los

Хорошая мысль!
- Спасибо, Ричард.