gpt4 book ai didi

java - 在 Java 中比较两个相似的 XML 数据与无序元素/属性

转载 作者:行者123 更新时间:2023-12-02 01:34:57 25 4
gpt4 key购买 nike

我正在寻找一个可以比较两个 XML 数据的 API。我尝试过 XMLUnit 2,但找不到让它在我的示例中正常工作的方法。您能给我一个适合我的需要的例子吗?

我的第一个 XML 数据 xml1:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<urlset xmlns="http://www.sitemap.org/schemas/sitemap/0.9">
<url>
<loc>a1/</loc>
<lastmod>a2</lastmod>
</url>
<url>
<loc>b1</loc>
<lastmod>b2</lastmod>
</url>
<url>
<loc>c1</loc>
<lastmod>c2</lastmod>
</url>
</urlset>

我的第二个 XML 数据 xml2:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<urlset xmlns="http://www.sitemap.org/schemas/sitemap/0.9">
<url><lastmod>b2</lastmod><loc>b1</loc></url>
<url>
<lastmod>c2</lastmod>
<loc>c1</loc>
</url>
<url>
<loc>a1/</loc>
<lastmod>a2</lastmod>
</url>
</urlset>

注意:

  • 大小相同(这里是 3 个 child )
  • urlset 的子节点 (url) 可能未排序
  • url 的元素(loclastmod)可能未排序
  • 忽略空格

寻找返回true的API,例如:

XMLUtils.isSimilar(xml1, xml2);

我对 XMLUnit 2 的不成功尝试(尝试使用多个“NodeMatcher”):

// Attempt with XmlAssert.assertThat:
XmlAssert.assertThat(xml1)
.and(xml2)
.ignoreChildNodesOrder()
.ignoreWhitespace()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText))
.areSimilar();

// Attempt with Diff
Diff myDiff = DiffBuilder.compare(xml1)
.withTest(xml2)
.ignoreWhitespace()
.checkForSimilar()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText))
.build();
myDiff.getDifferences();

最佳答案

您可以尝试如下

public class XMLUtils {
private static DocumentBuilderFactory documentBuilderFactory;
private static DocumentBuilder documentBuilder;
private static TransformerFactory transformerFactory;
private static Transformer transformer;
private static Document emptyDoc;

public XMLUtils() {
}

public XMLCompareResult compare(File expectedFile, File actualFile, boolean ignoreWhiteSpace) throws FileNotFoundException, SAXException, IOException {
FileInputStream expInpStream = new FileInputStream(expectedFile);
FileInputStream actualInpStream = new FileInputStream(actualFile);
Diff myDiff = null;
if (ignoreWhiteSpace) {
myDiff = DiffBuilder.compare(expInpStream).withTest(actualInpStream).checkForSimilar().ignoreWhitespace().withNodeMatcher(new DefaultNodeMatcher(new ElementSelector[]{ElementSelectors.byNameAndAllAttributes})).build();
} else {
myDiff = DiffBuilder.compare(expInpStream).withTest(actualInpStream).checkForSimilar().withNodeMatcher(new DefaultNodeMatcher(new ElementSelector[]{ElementSelectors.byNameAndAllAttributes})).build();
}

XMLResultUtil xmlr = new XMLResultUtil();
XMLCompareResult xs = xmlr.prepareXMLCompareResult(myDiff.getDifferences());
return xs;
}

static {
try {
documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilder = documentBuilderFactory.newDocumentBuilder();
transformerFactory = TransformerFactory.newInstance();
transformer = transformerFactory.newTransformer();
emptyDoc = documentBuilder.newDocument();
} catch (ParserConfigurationException var1) {
var1.printStackTrace();
} catch (TransformerConfigurationException var2) {
var2.printStackTrace();
}

}
}

我在这里复制了我们在项目中使用的方法。

您可以尝试一下吗?如果遇到任何问题请告诉我。我可以自己再尝试一下。

谢谢

关于java - 在 Java 中比较两个相似的 XML 数据与无序元素/属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55363758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com