Pergunta

Estou trabalhando no Microsoft Visual C# 2008 Express.

Digamos que eu tenho uma string e o conteúdo da string é: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."

Estou dizendo a mim mesma que quero fazer algo com a palavra "incrível" - possivelmente chamar uma função que faz algo chamado "colorize".

Qual é a melhor maneira em C# para detectar que essa tag existe e obtendo esse atributo? Eu trabalhei um pouco com Xelements e tal em C#, mas principalmente a ver com a leitura de arquivos XML.

Obrigado!

-Adeena

Foi útil?

Solução

Outra solução:

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
}

Também levei seu comentário para o Dabblernl, onde você deseja analisar vários atributos em vários elementos.

Outras dicas

Você pode extrair o XML com uma expressão regular, carregar a sequência XML extraída em um Xelement e sair daí:

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

Este código fará uma exceção se nenhum elemento mytag foi encontrado, mas isso pode ser remediado inserindo uma linha de:

if(match.Captures.Count!=0)
{...}

Fica ainda mais interessante se a string puder segurar mais do que apenas a tag mytag ...

Estou um pouco confuso sobre o seu exemplo, porque você alterna entre a string (conteúdo de texto), tags e atributos. Mas acho que o que você quer é XPath.

Então, se o seu fluxo XML se parece com o seguinte:

u003Cadeena/>u003Cparent>u003Cchild x="this is my awesome string">Esta é outra corda incrívelu003Cchild/>u003Cadeena/>

Você usaria uma expressão XPath que se parece com isso para encontrar o atributo:

// criança/@x

E um assim para encontrar o valor do texto sob a tag infantil:

//filho

Sou desenvolvedor de Java, então não sei quais bibliotecas XML você usaria para fazer isso. Mas você precisará de um analisador DOM para criar uma instância da classe de documentos W3C para você lendo no arquivo XML e usando o XPath para retirar os valores.

Há um bom Tutorial XPath das escolas W3C Se você precisar.

ATUALIZAR:

Se você está dizendo que já possui um fluxo XML como string, a resposta é não lê -la de um arquivo, mas da própria string. Java possui abstrações chamadas InputStream e leitor que lidam com fluxos de bytes e chars, respectivamente. A fonte pode ser um arquivo, uma string, etc. Verifique sua API C# DOM para ver se ele tem algo semelhante. Você passará a string para um analisador que devolverá um objeto DOM que você pode manipular.

Como a entrada não é XML bem formada, você não poderá analisá-lo com nenhuma das bibliotecas XML incorporadas. Você precisaria de uma expressão regular para extrair a peça bem formada. Você provavelmente poderia usar um dos analisadores html mais perdoadores como Htmlagilitypack no codeplex.

o XmlTextReader pode analisar fragmentos XML com um construtor especial que poderia Ajuda nessa situação, mas não tenho certeza disso.

Há um artigo detalhado aqui:

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

Esta é a minha solução para corresponder a qualquer tipo de XML usando regex:C# melhor maneira de detectar XML?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top