【发布时间】:2017-04-05 00:17:32
【问题描述】:
我们使用一种工具(pentaho 数据集成),它使用 XML 作为其文件的布局。它在这些文件中存储了太多信息(如连接信息)。在将文件推送到 Git 之前,我想清除所有使用 JNDI 的连接块。如果我使用 XSLT(这可能是一种可能性),实体将得到解决。这将导致 Git 在我每次进行少量编辑时都会看到大量更改 - 显然是不可取的。
我有一个包含以下行的 XML 文件:
<connections>
<connection>
<name>connection1</name>
<server/>
<type>POSTGRESQL</type>
<access>JNDI</access>
<database>connections/test/connection1</database>
<port>-1</port>
<username/>
<password>Encrypted </password>
</connection>
<connection>
<name>test</name>
<server>asdf</server>
<type>ORACLE</type>
<access>Native</access>
<database>asdf</database>
<port>1521</port>
<username>asdf</username>
<password>zcv</password>
</connection>
</connections>
我想把它简化为:
<connections>
<connection>
<name>test</name>
<server>asdf</server>
<type>ORACLE</type>
<access>Native</access>
<database>asdf</database>
<port>1521</port>
<username>asdf</username>
<password>zcv</password>
</connection>
</connections>
我不能使用 XSLT 解析器(例如 xmlstarlet),因为它会解析实体引用(&#x2f; 变为 /)。
我已经用 sed 试过了:
sed -ne '/<connection>/+.*/<access>/JNDI<\/access>/[\s\S]+.*<\/connection>/d'
但没有运气。
【问题讨论】:
-
你不想使用 sed 来处理 XML。
-
为什么解析实体是个问题?如果是 XML,那么这两种表示是等价的。如果它不是 XML,则问题被错误标记(并且您遇到更大的问题)。无论哪种方式,sed 都可能是适合这项工作的错误工具。
-
我们使用一种工具(pentaho 数据集成),它使用 XML 作为其文件的布局。它在这些文件中存储了太多信息(如示例中解释的连接)。在将文件推送到 GIT 之前,我想清除所有使用 JNDI 的连接块。如果我使用 XSLT(这可能是一种可能性),实体将得到解决。这将导致 GIT 在您每次要上传微小更改时看到大量更改。不用说,这是我们不想要的。
-
谢谢!好主意,完成了.. :)