2009-05-30 3 views
2

Я работаю над Microsoft Visual C# 2008 Express.Как работать с XML-тегом внутри строки?

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

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

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

Спасибо!

-Adeena

ответ

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 = XElement.Parse (@myXMLstring);» где у меня есть в строке. Затем я могу проверить, имеет ли он * дочерние элементы с элементом element.HasElements. дочерние элементы, как мне их вернуть? все дети не являются обязательными ... я должен сделать тест, чтобы увидеть, есть ли там каждый из них? – adeena

+0

уверен, что я обновил пример до лучших из моих представлений о том, что он которые вы хотите сделать. Он в основном выбирает элементы, которые вы указываете (разделенные символом |), в совпадения. Затем перебираем найденные элементы (если они есть) и обрабатываем их по-разному. Вам не нужно проверять, есть ли каждый из них, если они не там, они просто не выбраны в матчи. –

+0

прохладный. Это похоже на то, что я хочу сделать. Одна проблема с «IEnumerable» ... Я получаю следующую ошибку: «Usnig generic type». System.Collections.Generic.IEnumerable требует аргументов типа «1»? – adeena

0

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

Так что, если ваш поток XML выглядит следующим образом:

< adeena/> < родитель > < ребенок х = "это моя огромная строка" > Это еще одна удивительная строка < ребенок/> < adeena/>

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

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

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

// ребенок

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

Если вам это нужно, то XPath tutorial from the W3C schools.

UPDATE:

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

+0

В моих C# код, это: "Это мой удивительной строки." действительно, действительно сохранен как строка ... это моя проблема. как мне превратить его в XElement или Xpath или ...? – adeena

+0

Мой пример XML не является корректным; Извини за это. Я набрал его в SO, используя экранированные значения, и не очень хорошо справился с этим. – duffymo

0

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

+0

Пример в комментарии выглядит хорошо для меня. Что я упустил? – duffymo

+0

Ой, это мое. Не проверял себя достаточно близко. – duffymo

0

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

Там есть углубленные статья здесь:

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

1

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

string [email protected]"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) 
{...} 

Это становится еще более интересным, если строка может держать больше, чем просто Tag MyTag ...

+0

Я обманул, я удалил «Это моя» часть вашей строки, чтобы сделать XML хорошо сформированным. Надеюсь, что он все равно поможет вам – Dabblernl

+0

ну, я могу поместить свою строку во временный тег, как это, верно? « Это моя классная строка.« тогда у меня хорошо сформированный XML, и я думаю, что мне хорошо идти оттуда ... – adeena

+0

и связанный ... как я знаю (потому что у меня нет, когда я настраиваю свою строку и мой элемент), если тег «myTag» существует в элементе вообще? Это может не быть, или может быть «myTag2». (У меня есть несколько возможных тегов на этом уровне – adeena