Вопрос

Я работаю в 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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top