题
我正在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的更好方法?