XML中出错,查找并替换WIN';不固定

XML中出错,查找并替换WIN';不固定,xml,Xml,我在一个巨大的XML文件中犯了一个巨大的错误 <item1> <item2> <item1> //.. tons of stuff... </item1> </item2> </item1> //.. 很多东西。。。 我需要用别的东西替换外面的项目1。但是查找和替换不起作用,因为匹配的内部项1。我尝试过通过多条信息进行搜索,但我找到的每一条查找和替

我在一个巨大的XML文件中犯了一个巨大的错误

<item1>
    <item2>
        <item1>
            //.. tons of stuff...
        </item1>
    </item2>
</item1>

//.. 很多东西。。。
我需要用别的东西替换外面的项目1。但是查找和替换不起作用,因为匹配的内部项1。我尝试过通过多条信息进行搜索,但我找到的每一条查找和替换的单行性质使其不可能,而且所有数据都是选项卡式的


有什么想法吗?

你能利用这些标签吗?如果它与您的示例一样规则,那么您可能可以在
\t\t\t
(或您需要使用制表符搜索的任何语法)上搜索并替换为您需要的任何其他内容。

您可以利用制表符吗?如果它与您的示例一样规则,则您可能可以在
\t\t\t
(或使用制表符搜索所需的任何语法)上搜索并替换为所需的任何其他语法。

如果您可以匹配正则表达式,则可以匹配:

<item1>\n[any whitespace]<item2>
\n[任何空白]
并将其更改为:

<item3>\n[any whitespace]<item2>
</item3>\n[any whitespace]</item2>
\n[任何空白]
我也一样

</item1>\n[any whitespace]</item2>
\n[任何空白]
并将其更改为:

<item3>\n[any whitespace]<item2>
</item3>\n[any whitespace]</item2>
\n[任何空白]

我没有指定[any whitespace]表达式,因为我知道它对于不同的编辑器是不同的。

如果可以匹配正则表达式,则可以匹配:

<item1>\n[any whitespace]<item2>
\n[任何空白]
并将其更改为:

<item3>\n[any whitespace]<item2>
</item3>\n[any whitespace]</item2>
\n[任何空白]
我也一样

</item1>\n[any whitespace]</item2>
\n[任何空白]
并将其更改为:

<item3>\n[any whitespace]<item2>
</item3>\n[any whitespace]</item2>
\n[任何空白]

我没有指定[any whitespace]表达式,因为我知道它对于不同的编辑器是不同的。

使用正则表达式搜索或其他高级搜索/替换方法临时用其他内容替换内部标记(通过指定其前面的制表符)。然后替换剩余的item1标记(现在是外部标记),然后再将临时标记更改回原来的位置。

使用正则表达式搜索或其他高级搜索/替换方法将内部标记临时替换为其他标记(通过指定其前面的制表符)。然后替换剩余的item1标记(现在是外部标记),然后再重新更改临时标记。

如果XML的格式都是这样,您应该能够使用正则表达式。您也可以尝试格式化程序来获取该格式


否则,您可以使用您熟悉的语言用XML解析器读取XML,在那里更改并将其写回磁盘。

如果XML的格式都是这样的,您应该能够使用正则表达式。您也可以尝试格式化程序来获取该格式


否则,您可以使用您熟悉的语言用XML解析器读取XML,在那里更改并将其写回磁盘。

可以帮助。

可以帮助。

正则表达式在这种情况下可能有效,但正则表达式通常不是修改XML的最佳方法

。您应该使用XML工具来解析和操作XML数据,否则可能会在某个时候遇到问题

使用XSLT和特定“item1”元素的模板转换XML是一个更安全、更健壮的解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="item1[item2/item1]" >
        <!--Replace this literal element "NEW_ITEM_ELEMENT" with whatever name you need to change "item1" elements to: -->
        <NEW_ITEM_ELEMENT>
            <xsl:apply-templates />
        </NEW_ITEM_ELEMENT>
    </xsl:template>

</xsl:stylesheet> 

正则表达式可能在这种情况下起作用,但正则表达式通常不是修改XML的最佳方法

。您应该使用XML工具来解析和操作XML数据,否则可能会在某个时候遇到问题

使用XSLT和特定“item1”元素的模板转换XML是一个更安全、更健壮的解决方案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:template match="/">
        <xsl:apply-templates />
    </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="item1[item2/item1]" >
        <!--Replace this literal element "NEW_ITEM_ELEMENT" with whatever name you need to change "item1" elements to: -->
        <NEW_ITEM_ELEMENT>
            <xsl:apply-templates />
        </NEW_ITEM_ELEMENT>
    </xsl:template>

</xsl:stylesheet> 


您正在替换内部的,但这是一个想法。另外,它可能使用空格。我正在使用VisualStudio编辑XML。我可以在中执行正则表达式替换吗?按Ctrl+F,然后选中“使用正则表达式”复选框。文本框旁边有箭头,当您按下时,会显示一个包含common VS regex内容的菜单。成功!我用RegexBuddy做了这个替换。它工作得很好。非常感谢。我试过使用Visual Studio。它不需要任何表达式。您正在替换内部表达式,但这是一个想法。另外,它可能使用空格。我正在使用VisualStudio编辑XML。我可以在中执行正则表达式替换吗?按Ctrl+F,然后选中“使用正则表达式”复选框。文本框旁边有箭头,当您按下时,会显示一个包含common VS regex内容的菜单。成功!我用RegexBuddy做了这个替换。它工作得很好。非常感谢。我试过使用Visual Studio。我对正则表达式没有任何经验。我会在什么地方执行这种事情?@Stacey-这取决于你的编辑。VisualStudio可以做到这一点——它是“搜索和替换”对话框上的一个选项,Notepad++也可以。你在用什么编辑器?我对正则表达式没有经验。我会在什么地方执行这种事情?@Stacey-这取决于你的编辑。VisualStudio可以做到这一点——它是“搜索和替换”对话框上的一个选项,Notepad++也可以。你用的是什么编辑器?