Mil*_*use 4 .net c# regex xml parsing
我正在编写一些处理日志记录xml数据的代码,我希望能够替换文档中某些元素(例如密码)的内容.我宁愿不序列化和解析文档,因为我的代码将处理各种模式.
样本输入文件:
doc#1:
<user>
<userid>jsmith</userid>
<password>myPword</password>
</user>
Run Code Online (Sandbox Code Playgroud)
doc#2:
<secinfo>
<ns:username>jsmith</ns:username>
<ns:password>myPword</ns:password>
</secinfo>
Run Code Online (Sandbox Code Playgroud)
我希望我的输出是:
输出文档#1:
<user>
<userid>jsmith</userid>
<password>XXXXX</password>
</user>
Run Code Online (Sandbox Code Playgroud)
输出文档#2:
<secinfo>
<ns:username>jsmith</ns:username>
<ns:password>XXXXX</ns:password>
</secinfo>
Run Code Online (Sandbox Code Playgroud)
由于我将要处理的文档可能有各种模式,我希望能够找到一个很好的通用正则表达式解决方案,它可以找到带有密码的元素并相应地屏蔽内容.
我可以使用正则表达式和C#解决这个问题,还是有更有效的方法?
And*_*are 21
使用XSLT可以最好地解决此问题:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="//password">
<xsl:copy>
<xsl:text>XXXXX</xsl:text>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
只要正确处理命名空间,这将适用于两个输入.
确保具有ns
名称前缀的源文档具有为文档定义的命名空间,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<secinfo xmlns:ns="urn:foo">
<ns:username>jsmith</ns:username>
<ns:password>XXXXX</ns:password>
</secinfo>
Run Code Online (Sandbox Code Playgroud)
我会说你最好用.NET XmlDocument对象解析内容并使用XPath查找密码元素,然后更改其innerXML属性.它具有更正确的优点(因为XML首先不是常规的),并且它在概念上很容易理解.
根据尝试解析和/或修改XML而没有适当解析器的系统的经验,让我说:不要做.使用XML解析器(此处还有其他答案可以快速轻松地完成此操作).
使用非xml方法来解析和/或修改XML流将始终会让您在将来的某个时刻感到痛苦.我知道,因为我感到痛苦.
我知道,如果你使用正则表达式解决方案,它似乎会更快 - 运行时/更简单 - 代码/更容易理解/无论如何.但是你以后会让某人的生活变得悲惨.
归档时间: |
|
查看次数: |
21505 次 |
最近记录: |