Как мне работать с тегом XML внутри строки? - PullRequest
2 голосов
/ 30 мая 2009

Я работаю в Microsoft Visual C # 2008 Express.

Допустим, у меня есть строка и ее содержимое: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."

Я говорю себе, что хочу что-то сделать со словом «круто» - возможно, вызвать функцию, которая делает что-то под названием «раскрасить».

Как лучше всего в C # обнаружить, что этот тег существует, и получить этот атрибут? Я работал немного с XElements и тому подобным в C #, но в основном для чтения и чтения XML-файлов.

Спасибо!

-Adeena

Ответы [ 6 ]

2 голосов
/ 30 мая 2009

Другое решение:

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, где вы хотите проанализировать несколько атрибутов на нескольких элементах.

1 голос
/ 30 мая 2009

Вы можете извлечь 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 ...

0 голосов
/ 31 мая 2009

Это мое решение для соответствия любому типу XML с использованием Regex: C # Лучший способ обнаружить XML?

0 голосов
/ 30 мая 2009

XmlTextReader может анализировать фрагменты XML с помощью специального конструктора, который может помочь в этой ситуации, но я не уверен в этом.

Здесь есть углубленная статья:

http://geekswithblogs.net/kobush/archive/2006/04/20/75717.aspx

0 голосов
/ 30 мая 2009

Поскольку входные данные не являются правильно сформированным XML, вы не сможете проанализировать его ни с одной из встроенных библиотек XML. Вам нужно регулярное выражение, чтобы извлечь правильно сформированный кусок. Вероятно, вы могли бы использовать один из более щадящих HTML-парсеров, например HtmlAgilityPack в CodePlex.

0 голосов
/ 30 мая 2009

Я немного запутался в вашем примере, потому что вы переключаетесь между строкой (текстовое содержимое), тегами и атрибутами. Но я думаю, что вы хотите XPath.

Так что, если ваш поток XML выглядит так:

​​ Это еще одна потрясающая строка ​​

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

// ребенок / @ х

и вот так, чтобы найти текстовое значение под дочерним тегом:

// ребенок

Я разработчик Java, поэтому я не знаю, какие библиотеки XML вы бы использовали для этого. Но вам понадобится анализатор DOM, чтобы создать для вас экземпляр класса W3C Document, прочитав файл XML, а затем используя XPath для извлечения значений.

Есть хорошее учебное пособие по XPath от школ W3C , если оно вам нужно.

ОБНОВЛЕНИЕ:

Если вы говорите, что у вас уже есть XML-поток как String, тогда ответ заключается не в том, чтобы прочитать его из файла, а из самой String. В Java есть абстракции, называемые InputStream и Reader, которые обрабатывают потоки байтов и символов соответственно. Источником может быть файл, строка и т. Д. Проверьте API-интерфейс C # DOM, чтобы увидеть, имеет ли он что-то похожее. Вы передадите строку в анализатор, который вернет объект DOM, которым вы можете манипулировать.

...