Я пытаюсь создать парсер регулярных выражений для одного блока XML.Regex XML parsing C#
Я знаю, что люди скажут, что Regex не является хорошим планом для xml, но я работаю с данными потока, и мне просто нужно знать, был ли передан полный блок xml и находится в буфере.
Я пытаюсь обрабатывать все, что угодно между блоками открытия и закрытия XML и любыми данными в параметрах заголовка основного блока.
Мой примерный код находится под сломанным регулярным выражением, если у кого-то есть какие-либо сведения о том, как сделать это максимально возможным, я был бы очень признателен.
Вот мое регулярное выражение, отформатированное для визуальной помощи.
Я балансирую группу, а также группу и проверяя, что они не существуют в конце сегментов выражения.
/*
^(?<TAG>[<]
(?![?])
(?<TAGNAME>[^\s/>]*)
)
(?<ParamData>
(
(\"
(?>
\\\"|
[^"]|
\"(?<quote>)|
\"(?<-quote>)
)*
(?(quote)(?!))
\"
)|
[^/>]
)*?
)
(?:
(?<HASCONTENT>[>])|
(?<-TAG>
(?<TAGEND>/[>])
)
)
(?(HASCONTENT)
(
(?<CONTENT>
(
(?<inTAG>[<]\<TAGNAME>)(?<-inTAG>/[>])?|
(?<-inTAG>[<]/\<TAGNAME>[>])|
([^<]+|[<](?![/]?\<TAGNAME>))
)*?
(?(inTAG)(?!))
)
)
(?<TAGEND>(?<-TAG>)[<]/\<TAGNAME>[>])
)
(?(TAG)(?!))
*/
В моем классе я ожидаю, что любой возвращаемый объект Null означает, что в очереди не было блока xml.
Вот класс, который я использую.
(я использовал символьной строки (@ «»), чтобы ограничить требования к эвакуации, все "символы были заменены на„“форматировать правильно.
public class XmlDataParser
{
// xmlObjectExpression defined below to limit code highlight errors
private Regex _xmlRegex;
private Regex xmlRegex
{
get
{
if (_xmlRegex == null)
{
_xmlRegex = new Regex(xmlObjectExpression);
}
return _xmlRegex;
}
}
private string backingStore = "";
public bool HasObject()
{
return (backingStore != null) && xmlRegex.IsMatch(backingStore);
}
public string GetObject()
{
string result = null;
if (HasObject())
{
lock (this)
{
Match obj = xmlRegex.Match(backingStore);
result = obj.Value;
backingStore = backingStore.Substring(result.Length);
}
}
return result;
}
public void AddData(byte[] bytes)
{
lock (this)
{
backingStore += System.Text.Encoding.Default.GetString(bytes);
}
}
private static string xmlObjectExpression = @"^(?<TAG>[<](?![?])(?<TAGNAME>[^\s/>]*))(?<ParamData>((\""(?>\\\""|[^""]|\""(?<quote>)|\""(?<-quote>))*(?(quote)(?!))\"")|[^/>])*?)(?:(?<HASCONTENT>[>])|(?<-TAG>(?<TAGEND>/[>])))(?(HASCONTENT)((?<CONTENT>((?<inTAG>[<]\<TAGNAME>)(?<-inTAG>/[>])?|(?<-inTAG>[<]/\<TAGNAME>[>])|([^<]+|[<](?![/]?\<TAGNAME>)))*?(?(inTAG)(?!))))(?<TAGEND>(?<-TAG>)[<]/\<TAGNAME>[>]))(?(TAG)(?!))";
}
, если все, что вы хотите знать, если это полный XML-блок, передать его в XmlDocument и делать нагрузку на него. это будет намного быстрее, чем ваш регулярное выражение подход – Alex
'Я знаю, что люди скажут что Regex не является хорошим планом для xml' Regex - неплохой план для xml. – Jonesopolis
> «Анализ синтаксиса Regex XML» OOPS ... Ошибка в моем парсере. Rebooting ... –