2012-07-10 31 views
2

我试图格式化XML文档后拆分XML字符串,所以我传递一个字符串到的方法,如:使用正则表达式之前和比赛

"<foo><subfoo><subsubfoo>content</subsubfoo></subfoo><subfoo/></foo>" 

而且我试图分裂它基于找到标签。我想每一个元素(标签或内容)分割成唯一的字符串,如:

"<foo>", "<subfoo>", "<subsubfoo>", "content", "</subsubfoo>", "</subfoo>", "<subfoo/>", "</foo>" 

,并为此我使用的代码:

string findTagString = "(?<=<.*?>)"; 
Regex findTag = new Regex(findTagString); 
List<string> textList = findTag.Split(text).ToList(); 

上面的代码工作正常,只是它不“内容”分割成其自己的字符串,而不是:

"<foo>", "<subfoo>", "<subsubfoo>", "content</subsubfoo>", "</subfoo>", "<subfoo/>", "</foo>" 

有没有办法重写正则表达式acomplish到自己的字符串此,非匹配的分裂?

或者,改写:是否可以在正则表达式匹配之前将AND拆分为字符串?

+0

你为什么要这么做?什么是最终目标?有可能更有效的方法来做到这一点。 – 2012-07-10 18:50:51

+0

我只是试图创建一个包含每个标签或元素的组,以便我可以格式化它们并将它们放入FlowDocument以加载到RichTextBox(WPF)中。这正是我打算将其分解成多个部分的原因,以便我可以检查,格式化和插入这些部分。 – Canin 2012-07-10 19:01:12

回答

4

使用这个表达式(<.*?>)|(.+?(?=<|$)) 及演员匹配List<string>

+0

谢谢,这是诀窍。除了遍历列表和删除空列之外,是否有任何方法可以删除空字符串/不是首先选中它们? – Canin 2012-07-10 18:59:40

+0

你可以用递归替换空标签,或者使用这个正则表达式'(?<=>)([^ <>] +?)(?= <)'从标签获得值 – 2012-07-10 19:18:35

1

XML是不是正规的语言(可以用泵引理得到证实),因此XML不能与正则表达式解析。

我建议你找一个好的XML库并使用它。

+1

我真的只是想做非常基本的格式化如果用户不包含结束标记,或者保留属性,则可以捕获该用户。如果您愿意,可以使用NotePad ++的XML视图的基本版本。因此,我不在乎标签说什么,只是有标签。因此,语言不是有限的,因此不是常规的这一事实,对我的应用来说并不是真正的关注。否则,你会是对的。感谢您的帮助,SchighSchagh。 – Canin 2012-07-10 18:58:46

1

您可以通过正则表达式或xpath来实现,具体取决于xml的复杂性。

,如果你想使用正则表达式,你可能想要做这样的事情:

public static string xml = "<foo><subfoo><subsubfoo>content</subsubfoo></subfoo><subfoo/></foo>"; 
public static Regex re = new Regex(@"\<([A-Za-z0-9]*)\b[^>]*\>(.*?)\</\1\>"); 

static string GetContentViaRegex() 
{ 
    string content = xml; 
    while (re.IsMatch(content)) 
    { 
     Match match = re.Match(content); 
     if (!match.Success) 
      break; 

     content = match.Groups[2].Value; 
    } 
    return content; 
} 

正则表达式的基本搜索匹配的开启/结束标记(你不想匹配像<foo>stuff here, possibly including more tags</bar>),然后继续钻取匹配的标签,直到找到最内层的内容。这个正则表达式假定任何标签都没有属性。

,如果你想通过XPath来做到这一点,你可以做这样的事情:

static string GetContentViaXPath() 
{ 
    var nav = new XPathDocument(new StringReader(xml)).CreateNavigator(); 
    return nav.SelectSingleNode("//text()").Value; 
} 

基本上抓住它在文件中碰到第一个文本节点。 (除非您确定输入始终有效,否则您想添加错误检查)

+0

很好的正则表达式,用于获取带有子树的整个xml元素。当您使用XmlDocument,XmlReader将引发异常的格式不正确的xml片段时非常有用。 – 2015-02-13 15:02:20

0

由于忽略了html规范,因此<>没有任何意义。

它可以简单地通过与此(?<=>)|(?=<)拆分完成。

这就产生

<foo> 
<subfoo> 
<subsubfoo> 
content 
</subsubfoo> 
</subfoo> 
<subfoo/> 
</foo> 
相关问题