我有一些用户定义的标签。例如这里的数据,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>
答案 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']
这就是我所说的简单。