我使用的是PTC Arbortext编辑器,它最初是在20世纪80年代末的前XML(SGML)时代编写的。Java应用程序使用org.customMonkey.xmlUnit来区分XML文件。
diff工具无法解析文件,因为文件(在Windows上)需要一个以分号分隔的到各种编录文件位置的绝对路径列表,在该列表中,它将查找catalog
和/或catalog.xml
文件。它们可以使用catalog
指令。使用public
标识符映射到与特定目录文件相关的路径。
我正在使用这个目录信息解析XML,它可能包含文件实体和XML包含。
对于某些用例,我可以设置validatingfalse
,这样可以工作(假设这两个文件是有效的是合理的),但是对于某些文件,我必须读取目录信息来解析XML中的文件实体。
我可以要求用户提供一个到他们的顶级目录位置的绝对路径列表。然而,我对选择一个解析器并将其集成到代码中相当迷茫。
我使用的是Java1.8,但如果使用Java1.8可以帮助/简化,我不介意使用Java10。看起来9对javax.xml.catalog有一些简单的支持,但在1.8或10中没有。
我可以提供我的解析代码,如果这是重要的,但我不拘泥于任何一个解析器。
我的代码在下面。我从lsparser
切换到documentbuilder
是为了setvalidating(false)
。
以下是我希望能够使用的文件之一的几个摘录:
<?xml version="1.0" encoding="UTF-8"?>
<!--Arbortext, Inc., 1988-2016, v.4002-->
<!DOCTYPE Composer PUBLIC "-//Arbortext//DTD Composer 1.0//EN"
"../doctypes/composer/composer.dtd" [
<!ENTITY % stock PUBLIC "-//Arbortext//DTD Fragment - ATI Stock filter list//EN" "../composer/stock.ent">
%stock;
]>
<?Pub Inc?>
<Composer>
<Label>Compose to PDF</Label>
. . .
<Resource>
<Label></Label>
<Documentation></Documentation>&epicGenerator;
&fileSerializer;
&serverProfiler;
&clientProfiler;
&xslTransformer;
&epicSerializer;
&switch;
&errorHandler;
&namespaceFixer;
&atiEventConverter;
&foPropagator;
&extensionHandler;
&ditaPostProcessor;
&ditaStyledElementsTranslator;
&atictFilter;
&applicabilityFilter;
</Resource>
下面是我需要参考的目录文件中的几行:
PUBLIC "-//Arbortext//ENTITIES SAX Event Upstream Loop//EN" "upstreamLoop.ent"
PUBLIC "-//Arbortext//ENTITIES keyRef Resolver//EN" "keyRefResolver.ent"
PUBLIC "-//Arbortext//ENTITIES ATI Change Tracking Filter 1.0//EN" "atictFilter.ent"
PUBLIC "-//Arbortext//ENTITIES Font Filter 1.0//EN" "fontFilter.ent"
PUBLIC "-//Arbortext//ENTITIES Simple Attribute Cascader//EN" "simpleAttrCascader.ent"
我还研究了使用XSD(一个目录解析器)和JAXP DOM for XSLT验证XML。我觉得这不太可能解决我的问题,但可能是错误的。
我还查看了以下网站:
应该可以在我的程序中添加一些东西,它接受到test/doctypes文件夹(该文件夹,而不是其中的目录文件)的路径,然后CatalogTest.xml文件应该使用程序提示的“validate”选项成功解析。其他(昂贵的)SGML/XML感知软件可以这样做。一旦给出了test/doctypes文件夹的绝对路径,目录解析器就应该能够遵循test/doctypes/catalog文件中的catalog指令到test/other/forms/catalog文件,再到test/other/forms/forms.dtd。解析器应该能够解析test/other/forms/forms.dtd并使用它来验证test/catalogtest.xml。
真的,这个整个过程应该能够处理这样的catalog文件或catalog.XML文件,应该能够解析DTD或XSD文件,以及SGML或XML实例。但实际上我并不太关心SGML;在我的工作环境中,只有少数milspec情况仍然存在。
我愿意尝试多个解析器和/或解析器,或者让用户进行选择。
(也在前面提到的zip文件中)
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class ParseXmlWithCatalog {
public static void main(String[] args) {
int validating = JOptionPane.showOptionDialog(null, "Do you want validation?", "Please choose \"Yes\" for validation",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, JOptionPane.YES_OPTION);
parseDoc(getFile(args), validating == JOptionPane.YES_OPTION);
}
private static boolean parseDoc(File inFile, boolean validate) {
if (inFile == null) {
JOptionPane.showMessageDialog(null, "Failure opening input XML.");
}
try {
/*
System.setProperty(DOMImplementationRegistry.PROPERTY, "org.apache.xerces.dom.DOMImplementationSourceImpl");
DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();
DOMImplementationLS impl = (DOMImplementationLS) registry.getDOMImplementation("LS");
LSParser builder = impl.createLSParser(DOMImplementationLS.MODE_SYNCHRONOUS, null);
LSParserFilter filter = new InputFilter();
builder.setFilter(filter);
*/
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
if (!validate) {
builderFactory.setValidating(false);
builderFactory.setAttribute("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
}
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document testDoc = builder.parse(inFile.getPath());
System.out.println(testDoc.getFirstChild().getNodeName());
} catch (Exception exc) {
JOptionPane.showMessageDialog(null, "Failure parsing input XML: " + exc.getMessage());
return false;
}
return true;
}
public static File getFile(String[] args) {
if (args.length > 1) {
JOptionPane.showMessageDialog(null, "Too many arguments.");
return null;
}
if (args.length == 1) {
return new File(args[0]);
}
JFileChooser fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(false);
fileChooser.setDialogTitle("Select 1 XML file");
FileNameExtensionFilter filter = new FileNameExtensionFilter("XML Files", "xml", "ditamap", "dita", "style");
fileChooser.setFileFilter(filter);
int response = fileChooser.showOpenDialog(null);
if (response != JFileChooser.APPROVE_OPTION) {
// aborted
return null;
}
return fileChooser.getSelectedFile();
}
}
Apache XML Commons解析程序同时支持OASIS XML编录和旧的OASIS TR9401编录格式。请参阅https://xerces.apache.org/xml-commons/components/resolver/。
要在测试项目中启用目录查找,请执行以下操作:
>
从http://xerces.apache.org/mirrors.cgi#binary下载XML公共解析程序。
提取resolver.jar并将其添加到您的类路径中。
创建一个名为CatalogManager.properties的文本文件,并将其放在您的类路径中。在此文件中,添加目录的路径:
catalogs=./doctypes/catalog
import org.apache.xml.resolver.tools.CatalogResolver;
...
CatalogResolver cr = new CatalogResolver();
builder.setEntityResolver(cr);
本文向大家介绍PHP统计目录中文件以及目录中目录大小的方法,包括了PHP统计目录中文件以及目录中目录大小的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP统计目录中文件以及目录中目录大小的方法。分享给大家供大家参考,具体如下: 更多关于PHP文件与目录操作相关内容感兴趣的读者可查看本站专题:《php文件操作总结》与《PHP目录操作技巧汇总》 希望本文所述对大家PHP程序设计有所帮
文件管理不外乎文件或目录的创建、删除、查询、移动,有mkdir/rm/mv 文件查询是重点,用find来进行查询;find的参数丰富,也非常强大; 查看文件内容是个大的话题,文本的处理有太多的工具供我们使用,在本章中只是点到即止,后面会有专门的一章来介绍文本的处理工具; 有时候,需要给文件创建一个别名,我们需要用到ln,使用这个别名和使用原文件是相同的效果; 2.1. 创建和删除 创建:mkdir
当我试图注册一个文件而不是一个目录。我可以监听单个文件的更改,而不是整个目录吗?
问题内容: 我正在尝试获取目录及其子目录中所有文件的列表。我当前的递归方法如下: 但是,我希望有一种非递归的方式(可能是现有的API调用)来执行此操作。如果不是,这是最干净的方法吗? 问题答案: 您始终可以使用堆栈(对于DFS)或队列(对于BFS)将迭代解决方案替换为迭代解决方案:
问题内容: 我将GOPATH设置为 我有 并且 我不喜欢在我的root dev文件夹中如何强制使用这个通用的“ go”目录来保存许多不同客户的go项目。 问题答案: 是的,是目录列表(如)。运行以获取详细信息。例如,在Linux上,我有: 我在Windows上有类似的东西。 注意:Linux 用作列表分隔符。Windows 用作分隔符。 如果使用,它将默认为列表中的第一个目录。 运行以检查一切正确
问题内容: 使用此代码 返回特定目录中文件夹和文件的总和,而不用关心 子目录 。我想获取目录及其子目录中所有文件的数量。 PS:返回所有文件和文件夹的总和几乎无关紧要。 任何帮助表示赞赏,谢谢 问题答案: 试试这个。 它可能会帮助您。