【问题标题】:How do I Ignore Data Contained within XML Comments Using a JAXP SAX Parser?如何使用 JAXP SAX 解析器忽略 XML 注释中包含的数据?
【发布时间】:2020-03-18 19:15:04
【问题描述】:

我有一个包含许多键值对的大型 XML 文件。该文件包含多行 cmets 和实际数据。在 cmets 部分中,有一些关于如何排列数据/键值对的示例。我制作的 SAX 解析器成功地从文件中检索了键和值,但它也读取了 cmets 中包含的示例键/值,这是我不希望发生的。我怎样才能使我的 SAX 解析器忽略 cmets 部分中的所有内容?我不允许编辑文件,我必须使用 java.util.

以下是我正在使用的文件的示例。请注意评论部分中的数据标签。我不想读取这些标签中的示例数据,但我的解析器无论如何都会记录它们。

<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
      Microsoft ResX Schema

      Version 2.0

      The primary goals of this format is to allow a simple XML format
      that is mostly human readable. The generation and parsing of the
      various data types are done through the TypeConverter classes
      associated with the data types.

      Example:

      ... ado.net/XML headers & schema ...
      <resheader name="resmimetype">text/microsoft-resx</resheader>
      <resheader name="version">2.0</resheader>
      <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
      <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
      <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
      <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> **I DO NOT WANT TO READ THIS**
      <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
          <value>[base64 mime encoded serialized .NET Framework object]</value>
      </data>
      <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
          <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
          <comment>This is a comment</comment>
      </data>
-->
    <resheader name="reader">
        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
    </resheader>

    <data name="AmountUnits" xml:space="preserve">
        <value>Amount/Units</value>
    </data>
</root>

这是我正在使用的代码:

public class xmlPropertiesBuilder extends DefaultHandler {
    private boolean valueFound;

    public void readXMLFile(File xmlFile) throws SAXException, IOException, ParserConfigurationException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        parser.parse(xmlFile, this);
        valueFound = false;
    }

    @Override
    public void startDocument() throws SAXException {
        System.out.println("Start Document");
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("End Document");
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if(qName.equals("data")){
            System.out.println("Start Element: " + qName);
            System.out.println("Key: " + attributes.getValue("name"));
        } else if(qName.equals("value")){
            valueFound = true;
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if(qName.equals("data")){
            System.out.println("End Element: " + qName + "\n");
        }

    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if(valueFound){
            System.out.println("Value: " + new String(ch, start, length));
            valueFound = false;
        }
    }
}

【问题讨论】:

    标签: java xml sax jaxp


    【解决方案1】:

    看起来 JAXP SAX 解析器实际上忽略了 cmets 中包含的数据。我只是错误地解释了我的测试。在我的示例 XML 文件中,我没有包含一些标签,其中一个称为 &lt;reshader&gt;。这些 reshader 标签还包含一个 &lt;value&gt; 标签,我的解析器正在提取它(我认为它来自 cmets,但结果是来自 reshader)。

    我能够通过添加一个名为“dataFound”的布尔变量来解决我的问题,该变量只有在找到标签时才会设置为 true。然后在我的字符方法中,我只是将 if 条件从if(valueFound){...} 更改为if(dataFound &amp;&amp; valueFound){...}。最后,在endElement() 方法中,只要找到&lt;/data&gt; 标记,我就将'dataFound' 变量设置为false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-30
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多