c# - 使用C#正则表达式替换XML元素内容

标签 c# .net xml regex parsing

我正在编写一些代码来处理记录 xml 数据,我希望能够替换文档中某些元素(例如密码)的内容。我宁愿不序列化和解析文档,因为我的代码将处理各种模式。

示例输入文档:

文档#1:

   <user>
       <userid>jsmith</userid>
       <password>myPword</password>
    </user>

文档#2:

<secinfo>
       <ns:username>jsmith</ns:username>
       <ns:password>myPword</ns:password>
 </secinfo>

我希望我的输出是什么:

输出文档 #1:

<user>
       <userid>jsmith</userid>
       <password>XXXXX</password>
 </user>

输出文档#2:

<secinfo>
       <ns:username>jsmith</ns:username>
       <ns:password>XXXXX</ns:password>
 </secinfo>

由于我要处理的文档可能有多种模式,我希望提出一个很好的通用正则表达式解决方案,可以找到其中带有密码的元素并相应地屏蔽内容。

我可以使用正则表达式和 C# 解决这个问题还是有更有效的方法?

最佳答案

这个问题最好用 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>

只要您正确处理命名空间,这对两个输入都有效。

编辑:澄清“正确处理命名空间”的意思

确保具有 ns 名称前缀的源文档具有为文档定义的命名空间,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<secinfo xmlns:ns="urn:foo">
    <ns:username>jsmith</ns:username>
    <ns:password>XXXXX</ns:password>
</secinfo>

关于c# - 使用C#正则表达式替换XML元素内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/448376/

相关文章:

c# - 如何大写正则表达式模式?

c# - 无法从方法组转换为 Int32

c# - 非常简单的lambda表达式

c# - 语法问题 : Can't Change BackGround Of Particular button?

xml - 用于添加嵌套 xml 元素的 Jboss cli 命令

c# - Math.Sqrt() 的时间复杂度?

c# - 为什么 bool.TrueString 和 bool.FalseString 存在?

c# - 为什么它总是一个空值?

c++ - EscapeXML C++ Visual Studio

android - 如何使形状的顶部和侧面变白?