Java 将XML输入从多行转换为一行

Java 将XML输入从多行转换为一行,java,xml,perl,sed,Java,Xml,Perl,Sed,我有一个这样的xml <address> <street>abc</street> <number>123</number> </address> <address> <street>abc1</street> <number>345</number> </address> ... ... <address>

我有一个这样的xml

<address>
   <street>abc</street>
   <number>123</number>
</address>

<address>
   <street>abc1</street>
   <number>345</number>
</address>

...
...
<address>
   <street>xyz</street>
   <number>999</number>
</address>

abc
123
abc1
345
...
...
xyz
999
我希望能够将此转换为

<address><street>abc</street><number>123</number></address>
<address><street>abc1</street><number>345</number></address>
...
...
<address><street>xyz</street><number>999</number></address>
abc123
abc1345
...
...
xyz999
你能推荐我该怎么做吗?我想sed可能会有帮助,但一直无法让它工作


编辑:XML文件有类似类型的100K行,经过编辑以反映正确的输入和输出。

此链接应该对您有所帮助。他们的例子有点复杂,但不难改变以满足您的需求:


-请不要使用此链接。他们的例子有点复杂,但不难改变以满足您的需求:


-don

我不确定它的命令行语法,但这个正则表达式应该可以:

// Find:
/>[\n\s]+</
// Replace with:
><
//查找:
/>[\n\s]+<
这只会去除元素之间的空白(不在元素内部,除非它可能是CDATA区域),但您可能会意外地删除一些实际需要的空格,例如:

<p>here's <i>something</i> <b>interesting</b></p>
// becomes:
<p>here's <i>something</i><b>interesting</b></p>
这里有一些有趣的事情

//变成: 这里有些有趣的东西

下面是我提到的CDATA问题的一个示例:

<element><![CDATA[
    this shouldn't <blah>
    <blah> be touched.
]]></element>

// becomes:
<element><![CDATA[
    this shouldn't <blah><blah> be touched.
]]></element>
请触摸。
]]>

当然,“正确”的答案是使用解析器读取文件,然后在删除空白和缩进的情况下再次输出它。

我不确定它的命令行语法,但这个正则表达式应该可以:

// Find:
/>[\n\s]+</
// Replace with:
><
//查找:
/>[\n\s]+<
这只会去除元素之间的空白(不在元素内部,除非它可能是CDATA区域),但您可能会意外地删除一些实际需要的空格,例如:

<p>here's <i>something</i> <b>interesting</b></p>
// becomes:
<p>here's <i>something</i><b>interesting</b></p>
这里有一些有趣的事情

//变成: 这里有些有趣的东西

下面是我提到的CDATA问题的一个示例:

<element><![CDATA[
    this shouldn't <blah>
    <blah> be touched.
]]></element>

// becomes:
<element><![CDATA[
    this shouldn't <blah><blah> be touched.
]]></element>
请触摸。
]]>
当然,“正确”的答案是使用解析器读取文件,然后在删除空白和缩进的情况下再次输出文件。

您可以尝试以下代码(Java):

只需指定源xml文件名(源变量)和目标xml文件名(结果变量)。

您可以尝试以下代码(Java):


只需指定源xml文件名(源变量)和目标xml文件名(结果变量)。

您可以编写SAX解析器,在每个事件上只需将元素写入另一个文件,而无需新行。这将删除新行和垃圾空格。

您可以编写SAX解析器,在每个事件上只需将元素写入另一个文件而不需要新行。这将删除新行和垃圾空格。

tr
是替换新行的一种非常简单的方法:

cat addresses.xml | tr -d '\n'

谷歌搜索“shell替换新行”也会产生很多其他选项。

tr
是替换新行的一种非常简单的方法:

cat addresses.xml | tr -d '\n'

谷歌搜索“shell replace newline”也会产生很多其他选项。

[XML::Twig][1]附带了一个XML漂亮的打印机XML\u pp。如果地址行正好位于文档的根下,那么您可以使用它来接近所需的输出:

xml_pp -s record_c to_compact.xml

<root>
  <address><street>abc</street><number>123</number></address>
  <address><street>abc1</street><number>345</number></address>
  <address><street>xyz</street><number>999</number></address>
  <address><street>abc</street><number>123</number></address>
  <address><street>abc1</street><number>345</number></address>
  <address><street>xyz</street><number>999</number></address>
</root>

如果地址元素不在根目录下,请告诉我们,我会看看能做些什么。

[XML::Twig][1]附带了一个XML漂亮的打印机XML\u pp。如果地址行位于文档根目录下,那么您可以使用它来接近所需的输出:

xml_pp -s record_c to_compact.xml

<root>
  <address><street>abc</street><number>123</number></address>
  <address><street>abc1</street><number>345</number></address>
  <address><street>xyz</street><number>999</number></address>
  <address><street>abc</street><number>123</number></address>
  <address><street>abc1</street><number>345</number></address>
  <address><street>xyz</street><number>999</number></address>
</root>
如果address元素不在根下,请告诉我们,我将看看可以做什么。

正则表达式

(?<=>)\r?\n[ \t]*(?!<address)
(?)\r?\n[\t]*(?!正则表达式

(?<=>)\r?\n[ \t]*(?!<address)

(?)\r?\n[\t]*(?!另一种选择是使用XSLT样式表,它复制所有内容,但只复制地址元素中的元素和属性:

<?xml version="1.0"?>
<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="address">
        <xsl:copy>
            <xsl:apply-templates select="@*|*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

与regex方法不同,这应该适用于任何XML文档(即使换行符被编码为字符实体或在CDATA中),并且只格式化地址元素


您可以使用Java运行样式表,或者从命令行使用
xsltproc

运行样式表。另一个选项是使用XSLT样式表,它复制所有内容,但只复制地址元素中的元素和属性:

<?xml version="1.0"?>
<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="address">
        <xsl:copy>
            <xsl:apply-templates select="@*|*"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

与regex方法不同,这应该适用于任何XML文档(即使换行符被编码为字符实体或在CDATA中),并且只格式化地址元素

您可以使用Java运行样式表,或者从命令行使用
xsltproc

尝试以下选项: 在记事本++>打开xml文件>选择所有内容,然后在编辑选择>空白操作> 删除不必要的空白和下线

这对我很有用。

试试这个选项: 在记事本++>打开xml文件>选择所有内容,然后在编辑选择>空白操作> 删除不必要的空白和下线


这对我很有用。

我有大约100K行,我将编辑问题以反映我有大约100K行,我将编辑问题以反映你也可以在s.nextLine()之后添加trim()以删除标记之间的空白。你也可以在s.nextLine()之后添加trim()删除标记之间的空白。downvoter能否解释投票?解决方案适用于示例数据,并且还提供了关于正则表达式与解析器的警告。downvoter能否解释投票?解决方案适用于示例数据,并且还提供了关于正则表达式与解析器的警告。