如何在字符串中使用XML标记?

时间:2009-05-30 16:45:34

标签: c# xml linq xelement

我正在使用Microsoft Visual C#2008 Express。

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

我告诉自己我想对“awesome”这个词做点什么 - 可能会调用一个叫做“colorize”的函数。

在C#中检测此标记是否存在并获取该属性的最佳方法是什么?我在X#中使用XElements做了一些一些,但主要是用于读入和读出XML文件。

谢谢!

-Adeena

6 个答案:

答案 0 :(得分: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的评论,您希望在多个元素上解析多个属性。

答案 1 :(得分: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标签,那就更有趣了......

答案 2 :(得分:0)

我对你的例子有点困惑,因为你在字符串(文本内容),标签和属性之间切换。但我认为你想要的是XPath。

因此,如果您的XML流看起来像这样:

&lt; adeena /&gt;&lt; parent&gt;&lt; child x =“这是我真棒的字符串”&gt;这是另一个很棒的字符串&lt; child /&gt;&lt; adeena /&gt;

您将使用看起来像这样的XPath表达式来查找属性:

//子/ @ X

和这样的一个在子标记下找到文本值:

//子

我是一名Java开发人员,因此我不知道您使用哪些XML库来执行此操作。但是你需要一个DOM解析器来为你创建一个W3C Document类实例,方法是读入XML文件,然后使用XPath来获取值。

如果你需要的话,有一个很好的XPath tutorial from the W3C schools

更新:

如果你说你已经有一个XML流作为String,那么答案就是不从文件中读取它,而是从String本身读取它。 Java有一些名为InputStream和Reader的抽象,分别处理字节流和字符流。源可以是文件,字符串等。检查您的C#DOM API以查看它是否有类似的东西。您将把字符串传递给解析器,该解析器将返回您可以操作的DOM对象。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

XmlTextReader可以使用一个特殊的构造函数来解析XML片段,可能在这种情况下提供帮助,但我对此并不乐观。

这里有一篇深入的文章:

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

答案 5 :(得分:0)

这是我使用Regex匹配任何类型的xml的解决方案: C# Better way to detect XML?