Как мне работать с тегом XML внутри строки?

2

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

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

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

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

Спасибо!

-Adeena

Теги:
linq
xelement

6 ответов

2
Лучший ответ

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

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

  • 0
    Это выглядит ближе к тому, что я хочу сделать. Но вместо того, чтобы работать с «XDocument», могу ли я сделать это с Xelement? По сути, я могу установить свою строку как XElement с помощью этого: "XElement element = XElement.Parse (@myXMLstring);" где у меня есть <root> </ root> в строке. Затем я могу проверить, есть ли у него дочерние элементы с element.HasElements. Если у него есть дочерние элементы, как я могу их вернуть? все дети необязательны ... должен ли я пройти тест, чтобы увидеть, есть ли каждый из них?
  • 0
    уверен, что я обновил пример, насколько я понимаю, что вы хотите сделать. Он в основном выбирает элементы, которые вы указываете (разделены |) в совпадения. Затем переберите найденные элементы (если они есть) и обработайте их по-другому. Вы не должны проверять, есть ли каждый из них, хотя, если они не там, они просто не выбраны в совпадения.
Показать ещё 4 комментария
1

Вы можете извлечь 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
    Я обманул, я удалил «Это моя» часть вашей строки, чтобы сделать XML правильно сформированным. Надеюсь, что это все еще помогает вам
  • 0
    ну, я мог бы поместить свою строку во временный тег, как это, верно? "<tempTag> Это моя <myTag myTagAttrib =" colorize "> потрясающая </ myTag> строка. </ tempTag>", тогда у меня есть правильно сформированный XML, и я думаю, что мне хорошо идти оттуда ...
Показать ещё 3 комментария
0

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

0

Я немного запутался в вашем примере, потому что вы переключаетесь между строкой (текстовым контентом), тегами и атрибутами. Но я думаю, что вы хотите 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, который вы можете манипулировать.

  • 0
    В моем коде C # это: «Это моя <myTag myTagAttrib =" colorize "> удивительная </ myTag> строка.» действительно, действительно сохраняется как строка ... это моя проблема. как я могу превратить его в XElement или Xpath или ...?
  • 0
    Мой пример XML не правильно сформирован; прости за это. Я набрал его в SO, используя экранированные значения, и не очень хорошо с этим справился.
0

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

Здесь есть подробная статья:

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

0

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

  • 0
    Пример в комментарии выглядит правильно для меня. Что я пропустил?
  • 0
    Ой, это мое, это выключено. Не проверил себя достаточно близко.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню