.NET XML查找和替换节点

问题描述 投票:0回答:1

我有一个旧的应用程序,是在旧的架构中开发的,我需要把它带入现代世界;旧的架构有一些功能,我在复制时遇到了问题。我的想法是这样的。我是一个数据提供商 客户会对数据有特定的格式要求。为了方便客户,客户会建立 "xml文档模板",通过这种机制,我的应用程序将数据填充到他们需要的确切格式中。考虑这个任意的客户提供的xml样本。

<xml><data><people>
<replacetag1><person><name>$NAME$</name><address>$ADDRESS$</address></person></replacetag1>
</people></data></xml>

读取这个文档,代码发现 <replacetag1>,将所述标签内的内容提取出来并生成一个 <person><person>s. 这就把整个文档的格式化留给了客户和他们的要求。

该应用程序包含以下底层函数(vb.net,但也可以在c#中实现类似的功能)。

Dim oDoc = XElement.Load(FileName)
For Each oDesc In oDoc.Descendants
    If oDesc.Name.LocalName.StartsWith(TagPrefix, StringComparison.OrdinalIgnoreCase) Then
        Dim sVal = String.Concat(oDesc.Nodes)
        RaiseEvent TagReplace(oDesc.Name.LocalName, sVal)
        oDesc.ReplaceWith(sVal)
    End If
Next

而不是专门寻找标签 <replacetag1> 代码在标签名的开头(TagPrefix)上进行匹配,以预期它将因多种原因需要进行多次替换,而所有这些RaiseEventReplaceWith代码的功能与第一次传递时的预期完全一致。如果我在oDesc.ReplaceWith之后设置一个断点,此时文档(oDoc)看起来很完美。

但此时因为底层文档的变化,迭代器被打断,我在 "Next "处收到一个NullReferenceException。因为这个错误,我无法捕捉到第二次出现的另一个 <replacetag1> (不常见,但有可能)或另一种类型的替代物(即...)。<replacetag2>)在同一个文档中。我需要继续迭代文档的其他部分,寻找更多的替换,并需要它优雅地完成。

这是使用Xml.Linq,但DOM可能会更好地处理这种即时的文档修改;我对这两种技术都是新手。

编辑。为了处理来自内容本身的替换标签(也是因为原来的问题),我决定重新设计,以便在递归子内部进行递归扫描和替换。然后整个文档每次都会从头开始重新扫描,但它有机会处理替换内容里面的替换标签,并且可以简单地做一次 Exit For 在违规错误发生之前。

Dim oDoc = XElement.Load(FileName)
CheckReplacements(oDoc)
Private Sub CheckReplacements(XE As XElement)
    For Each oDesc In XE.Descendants
        If oDesc.Name.LocalName.StartsWith(TagPrefix, StringComparison.OrdinalIgnoreCase) Then
            Dim sVal = String.Concat(oDesc.Nodes)
            RaiseEvent TagReplace(oDesc.Name.LocalName, sVal)
            oDesc.ReplaceWith(XElement.Parse(sVal))
            CheckReplacements(XE)
            Exit For
        End If
    Next
End Sub

这个技术非常好用,在我的解决方案中也会继续使用。然而,如果没有将标记推送到一个元素中来包装输出,则会以XmlException在 XElement.Parse(). 有什么建议可以帮助我们更好地处理 sVal 作为文本或xml片段,是否也能按照我的期望处理编码?

.net xml dom
1个回答
1
投票

这可能对你没有吸引力,但我会通过把你的 "xml文档模板 "转换成XSLT样式表来实现(当然,使用XSLT进行转换)。然后你只需要应用生成的样式表,不需要低级的C#或LINQ编码。

这种方法的一个好处是,一旦你运行了这种方法,你就不局限于使用这种机器生成的样式表了;你也可以让你的数据消费者直接提供他们自己的XSLT代码。

© www.soinside.com 2019 - 2024. All rights reserved.