是否有任何方法可以在不使用任何解析器的情况下,在java中的特定位置添加另一个包含所有细节的标签


<?xml version="1.0"?>
<catalog>
<book id="bk102">
<author>Ralls, Kim</author>
N
<price>5.95</price>
<price>5.95</price>
<publish_date>2000-12-16</publish_date>
<description>A former architect battles corporate zombies, 
an evil sorceress, and her own childhood to become queen 
of the world.</description>
</book>
<book id="bk103">
<author>Corets, Eva</author>
<title>Maeve Ascendant</title>
<price>5.95</price>
<price>5.95</price>
<publish_date>2000-11-17</publish_date>
<description>After the collapse of a nanotechnology 
society in England, the young survivors lay the 
foundation for a new society.</description>
</book>
<book id="bk104">
<author>Corets, Eva</author>
<title>Oberon's Legacy</title>
<price>5.95</price>
<price>5.95</price>
<publish_date>2001-03-10</publish_date>
<description>In post-apocalypse England, the mysterious 
agent known only as Oberon helps to create a new life 
for the inhabitants of London. Sequel to Maeve 
Ascendant.</description>
</book>
<book id="bk105">
<author>Corets, Eva</author>
<title>The Sundered Grail</title>
<price>5.95</price>
<price>5.95</price>
<publish_date>2001-09-10</publish_date>
<description>The two daughters of Maeve, half-sisters, 
battle one another for control of England. Sequel to 
Oberon's Legacy.</description>
</book>
<book id="bk106">
<author>Randall, Cynthia</author>
<title>Lover Birds</title>
<genre>Romance</genre>
<price>4.95</price>
<publish_date>2000-09-02</publish_date>
<description>When Carla meets Paul at an ornithology 
conference, tempers fly as feathers get ruffled.</description>
</book>
<book id="bk107">
<author>Thurman, Paula</author>
<title>Splish Splash</title>
<genre>Romance</genre>
<price>4.95</price>
<publish_date>2000-11-02</publish_date>
<description>A deep sea diver finds true love twenty 
thousand leagues beneath the sea.</description>
</book>
<book id="bk108">
<author>Knorr, Stefan</author>
<title>Creepy Crawlies</title>
<genre>Horror</genre>
<price>4.95</price>
<publish_date>2000-12-06</publish_date>
<description>An anthology of horror stories about roaches,
centipedes, scorpions  and other insects.</description>
</book>
<book id="bk109">
<author>Kress, Peter</author>
<title>Paradox Lost</title>
<genre>Science Fiction</genre>
<price>6.95</price>
<publish_date>2000-11-02</publish_date>
<description>After an inadvertant trip through a Heisenberg
Uncertainty Device, James Salway discovers the problems 
of being quantum.</description>
</book>
<book id="bk110">
<author>O'Brien, Tim</author>
<title>Microsoft .NET: The Programming Bible</title>
<genre>Computer</genre>
<price>36.95</price>
<publish_date>2000-12-09</publish_date>
<description>Microsoft's .NET initiative is explored in 
detail in this deep programmer's reference.</description>
</book>
<book id="bk111">
<author>O'Brien, Tim</author>
<title>MSXML3: A Comprehensive Guide</title>
<genre>Computer</genre>
<price>36.95</price>
<publish_date>2000-12-01</publish_date>
<description>The Microsoft MSXML3 parser is covered in 
detail, with attention to XML DOM interfaces, XSLT processing, 
SAX and more.</description>
</book>
<book id="bk112">
<author>Galos, Mike</author>
<title>Visual Studio 7: A Comprehensive Guide</title>
<genre>Computer</genre>
<price>49.95</price>
<publish_date>2001-04-16</publish_date>
<description>Microsoft Visual Studio 7 is explored in depth,
looking at how Visual Basic, Visual C++, C#, and ASP+ are 
integrated into a comprehensive development 
environment.</description>
</book>
</catalog>

假设我想添加另一个标签,即bookid=111,以及所有细节,我试图应用的逻辑是将xml读取为字符串并计算字符数。之后,我将读取xml,直到我想替换的地方,然后迭代整个xm(字符串(。如果我遇到特定的索引,我将添加。有没有更好的方法可以在不使用解析器的情况下实现这一点。提前感谢

这必须在Java中吗?在XSLT(您可以从Java调用它(中实现这一点要容易得多。例如,如果您提供额外的book作为参数$newbook的值(作为包含词法XML的字符串(,那么将其添加到文档中只是

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
<xsl:param name="newbook"/>
<xsl:template match="/catalog">
<catalog>
<xsl:copy-of select="*, parse-xml($newbook)"/>
</catalog>
</xsl:template>
</xsl:transform>

这使用了XSLT3.0(例如Saxon(,但XSLT1.0解决方案(使用内置的JDKXSLT处理器(也是可能的,只是有点冗长。

XSLT解决方案当然会在底层使用真正的XML解析器。你肯定不想在不使用真正的解析器的情况下处理XML,我们在StackOverflow上看到了数百个问题,这些问题来自那些因为这样做而陷入困境的人。

您可以使用这样的东西。这不是理想的方式,因为您没有使用任何XML解析器,只需将新的XML附加到所需的位置即可。

还要注意,这不是一个一般的答案,这个答案非常具体地针对这个问题及其要求。

String xml = // your current XML String
StringBuilder originalXML = new StringBuilder( xml );
// Assume you want to inser after bk112
Pattern pattern = Pattern.compile( "(<book id="bk112">)([\s\S]*?)(<\/book>)" );
Matcher matcher = pattern.matcher( xml );
boolean isMatch = matcher.find();
if ( isMatch )
{
String group1 = matcher.group();
// new book tag you want to insert
String newBook ="<book id="bk113">n" +
"      <author>Test Author</author>n" +
"      <title>Test Title</title>n" +
"      <genre>Test</genre>n" +
"      <price>49.95</price>n" +
"      <publish_date>2001-04-16</publish_date>n" +
"      <description>Lorem Ipsum...</description>n" +
"   </book>n";
// get the last index of required tag. i.e. bk112
originalXML.insert( originalXML.lastIndexOf( "<book id="bk112">" ) + group1.length(), newBook );
System.out.println(originalXML.toString());
} 
else 
{ 
System.out.println( "failed to match regex" ); 
}

最新更新