2

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

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

我告诉自己我想对“真棒”这个词做点什么——可能调用一个函数来做一些叫做“着色”的事情。

C# 中检测此标记是否存在并获取该属性的最佳方法是什么?我在 C# 中使用过 XElements 等,主要与读入和读出 XML 文件有关。

谢谢!

-阿迪娜

4

6 回答 6

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 的评论,您希望在其中解析多个元素的多个属性。

于 2009-05-30T17:37:21.793 回答
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 标签,那就更有趣了……

于 2009-05-30T17:03:49.717 回答
0

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

因此,如果您的 XML 流如下所示:

<adeena/><parent><child x="this is my awesome string">这是另一个很棒的字符串<child/><adeena/>

您将使用如下所示的 XPath 表达式来查找属性:

//孩子/@x

像这样在子标签下找到文本值的方法:

//孩子

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

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

更新:

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

于 2009-05-30T16:53:06.780 回答
0

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

于 2009-05-30T16:56:12.127 回答
0

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

这里有一篇深入的文章:

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

于 2009-05-30T16:58:37.773 回答
0

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

于 2009-05-31T10:21:19.493 回答