我正在使用Microsoft Visual C#2008 Express。
假设我有一个字符串,字符串的内容是:"This is my <myTag myTagAttrib="colorize">awesome</myTag> string."
我告诉自己我想对“awesome”这个词做点什么 - 可能会调用一个叫做“colorize”的函数。
在C#中检测此标记是否存在并获取该属性的最佳方法是什么?我在X#中使用XElements做了一些一些,但主要是用于读入和读出XML文件。
谢谢!
-Adeena
答案 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?