我正在Microsoft Visual C#2008 Express工作。

假设我有一个字符串,字符串的内容是: "This is my <myTag myTagAttrib="colorize">awesome</myTag> string."

我告诉自己,我想对“很棒”一词做些事情 - 可能会称呼一种称为“着色”的函数。

C#中最好的方法是检测该标签存在并获得该属性的最佳方法?我工作了 一点 使用Xlements等在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表达式来查找属性:

// child/@x

这样的人可以在子标签下找到文本值:

//孩子

我是Java开发人员,所以我不知道您要使用什么XML库。但是,您需要一个DOM解析器来通过在XML文件中阅读,然后使用XPATH删除值来为您创建W3C文档类实例。

有一个好 W3C学校的XPath教程 如果需要的话。

更新:

如果您说的是已经有一个XML流作为字符串,那么答案是不要从文件中读取它,而是从字符串本身读取。 Java的抽象分别为处理字节和字符流的抽象称为InputStream和读取器。源可以是文件,字符串等。检查您的C#DOM API,以查看其是否具有类似的内容。您将将字符串传递给解析器,该解析器将归还可以操纵的DOM对象。

由于输入不是很好的XML,因此您将无法使用任何内置的XML库来对其进行解析。您需要一个正则表达式来提取良好的作品。您可能可以使用更宽容的HTML解析器之一 htmlagilitypack 在Codeplex上。

XmlTextReader 可以用特殊构造函数解析XML片段 可能 在这种情况下有所帮助,但我对此并不积极。

这里有一篇深入的文章:

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

这是我使用Regex匹配任何类型XML的解决方案:C#检测XML的更好方法?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top