Я работаю в Microsoft Visual С# 2008 Express.
Скажем, у меня есть строка, а содержимое строки: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."
Я говорю себе, что хочу что-то сделать с словом "awesome" - возможно, вызывается функция, которая делает что-то, называемое "раскрашивать".
Каков наилучший способ в С# обнаружить, что этот тег существует и получает этот атрибут? Я немного поработал с XElements и на С#, но в основном занимаюсь чтением и удалением 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...
Это мое решение для соответствия любому типу xml с помощью Regex: С# Лучший способ обнаружения XML?
Я немного запутался в вашем примере, потому что вы переключаетесь между строкой (текстовым контентом), тегами и атрибутами. Но я думаю, что вы хотите XPath.
Итак, если ваш поток XML выглядит так:
< adeena/ > <parent> < child x = "this is my awesome string" > Это еще одна удивительная строка <child> < adeena/ >
Вы должны использовать выражение XPath, которое выглядит так, чтобы найти атрибут:
//ребенок/@х
и один такой, чтобы найти текстовое значение под дочерним тегом:
//ребенок
Я разработчик Java, поэтому я не знаю, какие библиотеки XML вы будете использовать для этого. Но вам понадобится парсер DOM для создания экземпляра класса документа W3C для вас, прочитав в файле XML, а затем используя XPath, чтобы вырвать значения.
Там, где вам это нужно, хороший учебник XPath из школ W3C.
ОБНОВЛЕНИЕ:
Если вы говорите, что у вас уже есть поток XML как String, тогда ответ должен не читать его из файла, а из самой строки. Java имеет абстракции, называемые InputStream и Reader, которые обрабатывают потоки байтов и символов соответственно. Источником может быть файл, строка и т.д. Проверьте свой С# DOM API, чтобы увидеть, есть ли у него что-то подобное. Вы передадите строку в синтаксический анализатор, который даст объект DOM, который вы можете манипулировать.
XmlTextReader
может анализировать фрагменты XML со специальным конструктором, который может помочь в этой ситуации, но я не уверен в этом.
Здесь есть подробная статья:
http://geekswithblogs.net/kobush/archive/2006/04/20/75717.aspx
Поскольку вход не является корректным XML, вы не сможете его разобрать с помощью любой из встроенных XML-библиотек. Вам понадобится регулярное выражение для извлечения хорошо сформированной фигуры. Вероятно, вы можете использовать один из более прощающих парсеров HTML, например HtmlAgilityPack в CodePlex.