在java中的现成解析器

时间:2009-08-28 06:33:34

标签: java xml parsing

我有一些用户定义的标签。例如这里的数据,jssj。我有一个文件(不是xml),它包含一些嵌入在tags中的数据。我需要一个解析器来识别我的标签,并以适当的格式提取数据。 例如

<newpage> thix text </newpage>
<tagD>
 <tagA> kk</tagA>
</tagD>

标签也可以像html标签一样具有一些属性。例如

<mytag height="f" width ="d" > bla bla bla </mytag>
<mytag attribute="val"> bla bla bla</mytag>

5 个答案:

答案 0 :(得分:2)

您可以查看像antlr这样的解析器生成器。

除非您的标记语法可以使用(简单)常规语法表示(在这种情况下您可以尝试使用正则表达式扫描文件),否则您将需要一个正确的解析器。它实际上并不是很难 - 只是第一次尝起来像咬子弹......

答案 1 :(得分:2)

您可以使用已包含在Java中的JAXB。这很简单。 首先,您需要创建对XML代码的绑定。绑定提供了Java对象和XML代码之间的映射。

一个例子是:

@XmlRootElement(name = "YourRootElement", namespace ="http://someurl.org")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "intValue",
    "stringArray",
    "stringValue"}
)
public class YourBindingClass {
    protected int intValue;

    @XmlElement(nillable = false)
    protected List<String> stringArray;

    @XmlElement(name = "stringValue", required = true)
    protected String stringValue;

    public int getIntValue() {
        return intValue;
    }

    public void setIntValue(int value) {
        this.intValue = value;
    }

    public List<String> getStringArray() {
        if (stringArray == null) {
            stringArray = new ArrayList<String>();
        }
        return this.stringArray;
    }

    public String getStringValue() {
        return stringValue;
    }

    public void setStringValue(String value) {
        this.stringValue = value;
    }
}

然后,要将Java对象编码为XML,可以使用:

YourBindingClass yourBindingClass = ...;
JAXBContext jaxbContext = JAXBContext.newInstance(YourBindingClass.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, false);

/** If you need to specify a schema */
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new URL("http:\\www.someurl.org"));      
marshaller.setSchema(schema);
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, true);

ByteArrayOutputStream stream = new ByteArrayOutputStream();
marshaller.marshal(yourBindingClass, stream);
System.out.println(stream);

将XML解析回对象:

InputStream resourceAsStream = ... // Your XML, File, etc. 
JAXBContext jaxbContext = JAXBContext.newInstance(YourBindingClass.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Object r = unmarshaller.unmarshal(resourceAsStream);
if (r instanceof YourBindingClass) ...

从Java对象开始的示例:

YourBindingClass s = new YourBindingClass();
s.setIntValue(1);
s.setStringValue("a");
s.getStringArray().add("b1");
s.getStringArray().add("b2");

// marshal ...

结果:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:YourRootElement xmlns:ns2="http://someurl.org">
    <intValue>1</intValue>
    <stringArray>b1</stringArray>
    <stringArray>b2</stringArray>
    <stringValue>a</stringValue>
</ns2:YourRootElement>

如果您不知道输入格式,则表示您可能没有XML架构。如果您没有架构,那么它没有一些好处,例如:

  • 描述允许的文档内容更容易
  • 验证数据的正确性更容易
  • 定义数据方面(数据限制)更容易
  • 定义数据模式(数据格式)更容易
  • 在不同数据类型之间转换数据更容易

无论如何,前面的代码也适用于包含'unknown'标签的XML代码。但是,您的XML代码仍然必须提供必填字段并遵循声明的模式。 因此以下XML代码也是有效的。唯一的限制是:标签'stringValue'应该在那里。请注意,先前未声明'stringArrayQ'。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:YourRootElement xmlns:ns2="http://someurl.org">
         <stringValue>a</stringValue>
         <stringArrayQ>b1</stringArrayQ>
</ns2:YourRootElement>

答案 2 :(得分:1)

这些XML标签是?如果是这样,请查看已有的许多Java XML库之一。如果它们是某种自定义标记格式,那么您只需要自己编写它。

答案 3 :(得分:0)

对于xml标签 - 使用DOM解析器或SAX解析器。

答案 4 :(得分:0)

您的示例是具有此修改的XML:

<root>
  <newpage> thix text </newpage>
  <tagD>
    <tagA> kk</tagA>
  </tagD>
</root>

您可以使用任何要解析它的XML解析器。

编辑:

属性是XML的正常部分。

<root>
  <newpage> thix text </newpage>
  <tagD>
    <tagA> kk</tagA>
  </tagD>
  <mytag height="f" width ="d" > bla bla bla </mytag>
  <mytag attribute="val"> bla bla bla</mytag>
</root>

每个XML解析器都可以处理它们。

编辑:

如果你能够使用Python,你可以这样做:

import lxml.etree

doc = lxml.etree.parse("foo.xml")
print doc.xpath("//mytag[1]/@width")
# => ['d']

这就是我所说的简单。