Как я могу работать с тегом XML в строке?
Вопрос
Я работаю в Microsoft Visual C# 2008 Express.
Допустим, у меня есть строка, а содержимое строки: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."
Я говорю себе, что хочу сделать что -то с словом «потрясающе» - возможно, назвать функцию, которая выполняет что -то, что называется «цветной».
Как лучше всего определить, что этот тег существует и получает этот атрибут? Я работал немного с Xelements и тому подобное в C#, но в основном связано с чтением в файлах XML.
Спасибо!
-Adeena
Решение
Другое решение:
var myString = "This is my <myTag myTagAttrib='colorize'>awesome</myTag> string.";
try
{
var document = XDocument.Parse("<root>" + myString + "</root>");
var matches = ((System.Collections.IEnumerable)document.XPathEvaluate("myTag|myTag2")).Cast<XElement>();
foreach (var element in matches)
{
switch (element.Name.ToString())
{
case "myTag":
//do something with myTag like lookup attribute values and call other methods
break;
case "myTag2":
//do something else with myTag2
break;
}
}
}
catch (Exception e)
{
//string was not not well formed xml
}
Я также принял во внимание ваш комментарий Dabblernl, где вы хотите разобрать несколько атрибутов по нескольким элементам.
Другие советы
Вы можете извлечь XML с регулярным выражением, загрузите извлеченную строку XML в Xelement и оттуда: оттуда:
string text=@"This is my<myTag myTagAttrib='colorize'>awesome</myTag> text.";
Match match=Regex.Match(text,@"(<MyTag.*</MyTag>)");
string xml=match.Captures[0].Value;
XElement element=XElement.Parse(xml);
XAttribute attribute=element.Attribute("myTagAttrib");
if(attribute.Value=="colorize") DoSomethingWith(element.Value);// Value=awesome
Этот код вызовет исключение, если элемент MyTAG не будет найден, но это может быть исправлено, вставив линию:
if(match.Captures.Count!=0)
{...}
Становится еще интереснее, если строка может держать больше, чем просто тег MyTag ...
Я немного смущен в вашем примере, потому что вы переключаетесь между строкой (текстовым содержимым), тегами и атрибутами. Но я думаю, что вы хотите, это XPath.
Так что, если ваш XML -поток выглядит так:
u003Cadeena/>u003Cparent>u003Cchild x="this is my awesome string">Это еще одна потрясающая строкаu003Cchild/>u003Cadeena/>
Вы бы использовали выражение XPath, которое выглядит так, чтобы найти атрибут:
// ребенок/@x
и один вроде этого, чтобы найти значение текста под дочерним тегом:
//ребенок
Я разработчик Java, поэтому я не знаю, какие библиотеки XML вы бы использовали для этого. Но вам понадобится диапазон DOM, чтобы создать экземпляр класса документов W3C, читая в файле XML, а затем использовать XPath, чтобы вытащить значения.
Есть хорошо Учебное пособие XPATH из школ W3C Если вам это нужно.
ОБНОВИТЬ:
Если вы говорите, что у вас уже есть поток XML в качестве строки, то ответ состоит в том, чтобы не читать его из файла, а из самой строки. У Java есть абстракции, называемые InputStream и читатель, которые обрабатывают потоки байтов и ChARS, соответственно. Источником может быть файл, строка и т. Д. Проверьте свой API C# DOM, чтобы увидеть, есть ли у него что -то подобное. Вы передадите строку анализатору, который вернет объект DOM, которым вы можете манипулировать.
Поскольку вход не является хорошо сформированным XML, вы не сможете проанализировать его ни с одной из встроенных библиотек XML. Вам понадобится регулярное выражение, чтобы извлечь хорошо сформированную часть. Вы, вероятно, могли бы использовать один из самых прощающих HTML -анализаторов, таких как Htmlagilitypack на Codeplex.
А XmlTextReader
может анализировать фрагменты XML со специальным конструктором, который май Помогите в этой ситуации, но я не уверен в этом.
Здесь есть подробная статья:
http://geekswithblogs.net/kobush/archive/2006/04/20/75717.aspx
Это мое решение, чтобы соответствовать любому типу XML с помощью Regex:C# Лучший способ обнаружить XML?