面试题答案
一键面试主要类和接口设计
- 解析器接口(Parser Interface) 定义通用的解析方法。
public interface Parser {
Object parse(String text);
}
- XML解析器类(XMLParser Class)
实现
Parser
接口,针对XML文本解析。
public class XMLParser implements Parser {
@Override
public Object parse(String xmlText) {
// 使用XML解析库(如DOM、SAX、StAX等)进行解析
// 示例代码(使用DOM):
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xmlText)));
// 进一步处理doc获取数据
return doc;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
- HTML解析器类(HTMLParser Class)
实现
Parser
接口,针对HTML文本解析。
public class HTMLParser implements Parser {
@Override
public Object parse(String htmlText) {
// 使用HTML解析库(如Jsoup)进行解析
try {
Document doc = Jsoup.parse(htmlText);
// 进一步处理doc获取数据
return doc;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
- 纯文本解析器类(PlainTextParser Class)
实现
Parser
接口,针对纯文本解析。
public class PlainTextParser implements Parser {
@Override
public Object parse(String plainText) {
// 例如按行分割等简单处理
String[] lines = plainText.split("\n");
return lines;
}
}
- 解析规则接口(ParsingRule Interface) 定义根据不同规则提取数据的方法。
public interface ParsingRule {
Object extractData(Object parsedResult);
}
- 通用文本解析框架类(TextParsingFramework Class) 管理解析器和规则,执行解析和数据提取。
public class TextParsingFramework {
private Parser parser;
private ParsingRule rule;
public TextParsingFramework(Parser parser, ParsingRule rule) {
this.parser = parser;
this.rule = rule;
}
public Object process(String text) {
Object parsedResult = parser.parse(text);
if (parsedResult != null) {
return rule.extractData(parsedResult);
}
return null;
}
}
实现扩展性
- 添加新的解析规则
- 实现
ParsingRule
接口,创建新的规则类。例如,创建一个从XML解析结果中提取特定标签值的规则类:
- 实现
public class XMLTagValueExtractionRule implements ParsingRule {
private String tagName;
public XMLTagValueExtractionRule(String tagName) {
this.tagName = tagName;
}
@Override
public Object extractData(Object parsedResult) {
if (parsedResult instanceof Document) {
Document doc = (Document) parsedResult;
NodeList nodes = doc.getElementsByTagName(tagName);
if (nodes.getLength() > 0) {
return nodes.item(0).getTextContent();
}
}
return null;
}
}
- 在使用框架时,将新的规则类实例传递给`TextParsingFramework`。
Parser xmlParser = new XMLParser();
ParsingRule xmlRule = new XMLTagValueExtractionRule("title");
TextParsingFramework framework = new TextParsingFramework(xmlParser, xmlRule);
String xmlText = "<root><title>Sample Title</title></root>";
Object result = framework.process(xmlText);
- 添加新的文本类型支持
- 实现
Parser
接口,创建新的解析器类。例如,创建一个JSON解析器类(假设需要支持JSON文本):
- 实现
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
public class JSONParser implements Parser {
@Override
public Object parse(String jsonText) {
try {
JsonObject jsonObject = JsonParser.parseString(jsonText).getAsJsonObject();
return jsonObject;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
- 创建针对JSON解析结果的`ParsingRule`实现类。
- 在使用框架时,将新的解析器和规则实例传递给`TextParsingFramework`。
Parser jsonParser = new JSONParser();
ParsingRule jsonRule = new JSONKeyExtractionRule("name");
TextParsingFramework framework = new TextParsingFramework(jsonParser, jsonRule);
String jsonText = "{\"name\":\"John\"}";
Object result = framework.process(jsonText);
通过以上架构设计,利用接口和类的实现,可方便地实现解析规则和文本类型支持的扩展。