应用程序包含string
变量,其中包含xml
个数据
我尝试使用<product_desc></product_desc>
删除所有代码Regex
以下是string
变量
<orderlines>
<orderline>
<id>1000001</id>
<product_id>2004</product_id>
<product_desc>ITEM2004
Color: red
Size: 150x10x10
Material: iron
</product_desc>
<qnt>2</qnt>
</orderline>
<orderline>
<id>1000002</id>
<product_id>2012</product_id>
<product_desc>ITEM2012</product_desc>
<qnt>4</qnt>
</orderline>
<orderline>
<id>1000003</id>
<product_id>3000</product_id>
<product_desc>DELIVERY</product_desc>
<qnt>1</qnt>
</orderline>
</orderlines>
当我使用下一个模式时:
Dim pattern As String = "(<product_desc>[\s\S]*</product_desc>)"
Dim newvalue As String = Regex.Replace(originvalue, pattern, "")
我得到的结果如下:
<orderlines>
<orderline>
<id>1000001</id>
<product_id>2004</product_id>
<qnt>1</qnt>
</orderline>
</orderlines>
问题是Regex
匹配第一个<product_desc>
和最后一个</product_desc>
之间的所有值,并用空字符串替换它们。此方法会删除它们之间的所有<orederline>
标记(检查<qnt>
标记的值)。
任何人都可以提供一些关于限制删除的提示,仅删除特定标记。标签的内容可以包含所有可能的字符,换行符甚至HTML代码。
答案 0 :(得分:2)
不是您的问题的答案,而是回应您的意见。您可以使用XmlConvert.IsXmlChar这样的方法从字符串中删除无效的xml字符,然后使用XmlDocument加载它:
Public Shared Function RemoveInvalidXmlChars(xml As String) As String
Dim validXmlChars = xml.Where(Function(x) XmlConvert.IsXmlChar(x)).ToArray()
Return New String(validXmlChars)
End Function
从这个答案转换而来,还有一些其他建议:How do you remove invalid hexadecimal characters from an XML-based data source prior to constructing an XmlReader or XPathDocument that uses the data?
答案 1 :(得分:1)
问题:[\s\S]*
贪婪
它将每个字符匹配到字符串的末尾,然后引擎回溯以允许</product_desc>
匹配。因此,从第一个开始标记到最后一个结束标记只有一个匹配。
解决方案(如果我们正在使用正则表达式):一个懒惰的量词
有关使用正则表达式解析xml的所有警告和免责声明......您可以这样做:
?
添加到量词会使其变为&#34;懒惰&#34;,以便它只根据需要匹配多个字符。.*?
(如下面的示例代码所示)或[\s\S]*?
(但没有任何意义)。示例代码
Dim ResultString As String
Try
ResultString = Regex.Replace(SubjectString, "(?s)<product_desc>.*?</product_desc>", "")
Catch ex As ArgumentException
'Syntax error in the regular expression
End Try
<强>参考强>
答案 2 :(得分:0)
我会使用像Linq2Xml(XDocument和朋友)这样的XML API来做这种事情。为什么重新发明轮子?