Java 编译器在解析的XML文件中省略了DOCTYPE,如何将其包含在最终文件中?

Java 编译器在解析的XML文件中省略了DOCTYPE,如何将其包含在最终文件中?,java,xml,processing,Java,Xml,Processing,我正在基于一些任意数据解析一个XML文件。最后一个XML文件表示为另一个应用程序的保存文件,对此我没有控制权。但是,为了将其正确加载到程序中 <!DOCTYPE Workspace > 必须包含在文件的顶部。Processing/JavaXML解析器(据我所知,其他XML解析器也是如此)总是忽略这一行 我到处都找了,但是我没有找到解决这个问题的办法。我不熟悉DTD,据我所知,我也不必熟悉,因为Doctype定义超出了我的控制范围 XML xml; ... String da

我正在基于一些任意数据解析一个XML文件。最后一个XML文件表示为另一个应用程序的保存文件,对此我没有控制权。但是,为了将其正确加载到程序中

<!DOCTYPE Workspace >

必须包含在文件的顶部。Processing/JavaXML解析器(据我所知,其他XML解析器也是如此)总是忽略这一行

我到处都找了,但是我没有找到解决这个问题的办法。我不熟悉DTD,据我所知,我也不必熟悉,因为Doctype定义超出了我的控制范围

XML xml;
...


String data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Workspace >
xml = parseXML(data);
XML;
...
字符串数据=”
xml=parseXML(数据);
实际结果是一个文件,在该文件中,除了

<!DOCTYPE Workspace >

声明

有什么解决办法吗

编辑: 根据要求,我正在生成的XML文件中有一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<!--Notice how it doesn't include <!DOCTYPE Workspace > here -->
<Workspace xmlns="http://www.qlcplus.org/workspace" CurrentWindow="FixtureManager">
  <Creator>
    <Name>Q Light Controller Plus</Name>
    <Version>4.12.1</Version>
    <Author>steph</Author>
  </Creator>
  <Engine>
    <InputOutputMap>
      <Universe ID="0" Name="Universe 0">
        <Input Line="0" Plugin="MIDI"/>
        <Output Line="6" Plugin="ArtNet"/>
        <PluginParameters outputIP="192.168.0.24"/>
      </Universe>
    </InputOutputMap>
    <Fixture>
      <Manufacturer>Generic</Manufacturer>
      <Model>Generic RGB</Model>
      <Mode>RGB</Mode>
      <ID>1</ID>
      <Name>Generic RGB #1</Name>
      <Universe>0</Universe>
      <Address>0</Address>
      <Channels>3</Channels>
    </Fixture>
...
  </Engine>
</Workspace>

Q灯光控制器升级版
4.12.1
斯蒂芬
通用的
通用RGB
RGB
1.
通用RGB#1
0
0
3.
...
以及生成它的代码:

  data = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><!DOCTYPE Workspace ><Workspace xmlns=\"http://www.qlcplus.org/workspace\" CurrentWindow=\"FixtureManager\"><Creator><Name>Q Light Controller Plus</Name><Version>4.12.1</Version><Author>steph</Author></Creator><Engine><InputOutputMap><Universe Name=\"Universe 0\" ID=\"0\"><Input Plugin=\"MIDI\" Line=\"0\"/><Output Plugin=\"ArtNet\" Line=\"6\"/><PluginParameters outputIP=\"192.168.0.24\"/></Universe></InputOutputMap>";

  for(int x = 0; x < 48; x++){
    for(int y = 0; y < 28; y ++){
      fixtureTracker++;
      String fixtureData = "<Fixture><Manufacturer>Generic</Manufacturer><Model>Generic RGB</Model><Mode>RGB</Mode><ID>" + fixtureTracker + "</ID><Name>Generic RGB #" + fixtureTracker + "</Name><Universe>" + universe + "</Universe><Address>" + address + "</Address><Channels>3</Channels></Fixture>";
      if(address > 500){
        address = 0;
        universe++;
      }else{
        address += 3;
      }
      data = data.concat(fixtureData);
    }
  }

  data = data.concat("</Engine></Workspace>");
  xml = parseXML(data);

  saveXML(xml, "xmldata.qxw");
data=“Q灯光控制器加4.12.1步”;
对于(int x=0;x<48;x++){
对于(int y=0;y<28;y++){
fixtureTracker++;
字符串fixtureData=“GenericGeneric RGBRGB”+fixtureTracker+“Generic RGB”#“+fixtureTracker+”“+universe+”“+address+“3”;
如果(地址>500){
地址=0;
宇宙++;
}否则{
地址+=3;
}
data=data.concat(fixtureData);
}
}
data=data.concat(“”);
xml=parseXML(数据);
saveXML(xml,“xmldata.qxw”);

我知道工作区是在第3行定义的,但是,我仍然需要在生成的文件中包含DOCTYPE声明。

请您提供一个声明,好吗?我们无法确切地看到您是如何解析XML的,或者您随后使用它做了什么。伪代码在这里没有完整的示例那么有用。据我所知,您需要DOCTYP只需输入文档元素的名称,而在您使用应用程序创建的XML文件中没有其他详细信息。但这取决于您创建/序列化XML的方式,例如,有多种不同的方式在Java中写出XML。因此,请向我们展示您写出XML文件的Java代码。就其本身而言,DOCTYPE没有内部或外部外部子集只声明文档(“根”)元素的预期名称,不一定成为XML数据解析表示的一部分,这取决于您使用的Java XML API。您可以发布有关如何生成XML文件的代码吗?为什么首先构建包含XML的字符串,然后解析该字符串(就像在
parseXM()
中一样,尽管我们不知道这是什么),然后再次序列化结果?当
数据
字符串已经包含XML时,您所需要做的就是将其写入一个文件,例如
新的PrintStream(“xmldata.qxw”).println(data)
@imhotap
parseXML()
用于将其转换为正确解析的XML对象(缩进和换行),这对未来的可扩展性、可检索性和可读性非常有用。它主要用于检索动态数据,但现在还不是这样。虽然我想如果无法解决我最初的问题,我将不得不应用您的建议。请您提供一个解决方案。我们无法确切了解您是如何解析XML的,或者您当时在做什么使用它。伪代码在这里没有完整的示例那么有用。据我所知,您希望DOCTYPE只包含文档元素的名称,而在您使用应用程序创建的XML文件中没有其他详细信息。但这取决于您创建/序列化XML的方式,例如,有多种不同的方式来编写XM因此,请向我们展示写出XML文件的Java代码。在其自身中,没有内部或外部子集的DOCTYPE只声明文档的预期名称(“根”)元素,并且不一定成为XML数据解析表示的一部分,这取决于您使用的Java XML API。您可以发布有关如何生成XML文件的代码吗?为什么首先构建一个包含XML的字符串,然后解析该字符串(如
parseXM()
,尽管我们不知道这是什么功能),然后再次序列化结果?由于您的
数据
字符串已经包含XML,您只需将其写入一个文件,例如
new PrintStream(“xmldata.qxw”)。println(data)
@imhotap
parseXML()
用于将其转换为正确解析的XML对象(缩进和换行),这对将来的可扩展性、可检索性和可读性都很有用。它主要用于检索动态数据,但现在还不是这样。虽然我想如果无法解决我最初的问题,我必须应用你的建议。