dom4j解析xsd

package dom4j;


import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.io.SAXReader;




public class ReadXML {
static List<Element> list  =new ArrayList<Element>();;
//获取根目录
public Element getRoot(File file){
Element root = null;
//获取读取xml对象的工具
SAXReader saxReader = new SAXReader();
try {
//得到内容
Document document = saxReader.read(file);
//获取根节点
root = document.getRootElement();
//System.out.println(root.getName());
} catch (DocumentException e) {
e.printStackTrace();
}
return root;
}
//得到根目录的属性以及 命名空间 属性和 根节点的名字
public Map<String, String> getRootProperteis(Element root){
//创建存储对象map
Map<String, String> map = new HashMap<String, String>();
//得到命名空间的属性
@SuppressWarnings("unchecked")
List<Namespace> namespacesList = root.declaredNamespaces();
//int len = namespacesList.size();
//System.out.println(len);
for (Namespace namespace : namespacesList) {
//System.out.println(namespace.getPrefix()+namespace.getURI());
if(
namespace.getPrefix().equals("")){
map.put("xmlns"+namespace.getPrefix(), namespace.getURI());
}else {
map.put("xmlns:"+namespace.getPrefix(), namespace.getURI());
}
}
//得到属性
@SuppressWarnings("unchecked")
List<Attribute> attributesList = root.attributes();
for (Attribute attribute : attributesList) {
map.put(attribute.getName(), attribute.getValue());
}
//得到根节点的名字
if(root.getQualifiedName().equals("xsd:documentation")){
map.put("xsd:documentation", root.getText().trim());
}else{
map.put("rootNodeName", root.getQualifiedName());
}

return map;
}

//获取节点列表
public List<Element> getNodeList(Element root){
List<Element> elementList = root.elements();
for (Element element : elementList) {


//是不是复杂元素,是不是混合元素
//System.out.println(element.hasMixedContent());
//是不是纯文本
//System.out.println(element.isTextOnly());
}
//System.out.println(elementList.size());
return elementList;
}
//获取节点属性
public Map<String, String> getNodeProperteis(Element root,List<Element> list){
List<Element> elementList = getNodeList(root);
Map<String, String> map = new HashMap<String,String>();
//System.out.println(elementList.size());
for (Element element : elementList) {



//System.out.println(element.getQualifiedName());
//判断是否有命名空间
if(element.declaredNamespaces().size() > 0){
List<Namespace> namespacesList = element.declaredNamespaces();
for (Namespace namespace : namespacesList) {
//System.out.println(namespace.getPrefix()+namespace.getURI());
if(namespace.getPrefix().equals(""))
map.put("xmlns"+namespace.getPrefix(), namespace.getURI());
else {
map.put("xmlns:"+namespace.getPrefix(), namespace.getURI());
}
}
}
//获取节点内容
//System.out.println("element.getTextTrim()"+element.getTextTrim());
map.put("text", element.getTextTrim());
//获取节点 的名字
map.put("childenNodeName", element.getQualifiedName());
//获取属性的键值对
//System.out.println(element.attributes().size());
List<Attribute> attributesList = element.attributes();
//System.out.println(attributesList.size());
for (Attribute attribute : attributesList) {
map.put(attribute.getName(), attribute.getValue());
//System.out.println(attribute.getName()+"==="+attribute.getValue());
}
//如果是复杂元素
if(element.hasMixedContent()){
map.putAll(getNodeProperteis(element, list));

}
}
return map;
}
//获取所有的节点集合
public List<Element> getAllNode(Element root){

List<Element> elementList = root.elements();
for (Element element : elementList) {

list.add(element);
//如果还有子节点
if(element.hasMixedContent()){
getAllNode(element);
}
}
return list;
}
//遍历属性是否存在
public boolean isAttribute(String attrName){
//获取属性列表

return false;
}
//根据属性值获取节点
public Element fromName2Elemen(Element root,String propeity){
List<Element> eleList = getAllNode(root);
Element e = null;
int i = eleList.size();
//通过 属性值获取 节点 内容
//propeity = "cmof:OpaqueExpression";
System.out.println(i);



for (int j = 0; j < i; j++) {

Map<String, String> strMap = getRootProperteis(eleList.get(j));
for(String s:strMap.keySet()){
if(propeity.equals(strMap.get(s))){
System.out.print("要查的属性存在");
System.out.print("这是第"+(j+1)+"个element;");
System.out.println("整个节点内容为:"+eleList.get(j));
e = eleList.get(j);
}
}
}
return e;
}

public static void main(String[] args) {
//获取根目录
String path = System.getProperty("user.dir");
//获取路径
String url = path+"\\src\\main\\java\\persistence_1_0.xsd";
File file = new File(url);
//获取对象
ReadXML readXML = new ReadXML();
Element root = readXML.getRoot(file);

//获取节点列表
List<Element> eleList = readXML.getAllNode(root);
System.out.println(eleList.size());
for (Element element : eleList) {
//System.out.println(readXML.getRootProperteis(element));
}

System.out.println(readXML.fromName2Elemen(root, "persistence:persistence-unit-transaction-type"));
//获取根目录
//得到根目录的属性以及 命名空间 属性和 根节点的名字
//获取节点列表
//获取节点属性
//遍历属性是否存在
//根据属性值获取节点
}

}


persistence_1_0.xsd

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Java的dom4j根据XSD文件,调整错误节点到正确的位置,需要进行以下步骤: 1. 解析XSD文件,获取元素的层级关系。 ```java SAXReader reader = new SAXReader(); Document xsdDoc = reader.read(new File("schema.xsd")); Element root = xsdDoc.getRootElement(); Map<String, Element> elementMap = new HashMap<>(); getElementMap(elementMap, root); ``` 其中,`getElementMap`方法可以递归获取所有的元素节点,并将其存储在一个`Map`中,方便后续操作。 2. 解析XML文件,获取错误节点。 ```java Document xmlDoc = reader.read(new File("data.xml")); Element errorNode = (Element)xmlDoc.selectSingleNode("//error"); ``` 这里假设错误节点为`error`,可以通过XPath表达式获取该节点。 3. 根据错误节点的路径,获取其应该插入的父节点。 ```java String errorPath = errorNode.getUniquePath(); String parentPath = errorPath.substring(0, errorPath.lastIndexOf("/")); Element parentNode = elementMap.get(parentPath); ``` 这里,通过`getUniquePath`方法获取错误节点的路径,然后根据路径获取其应该插入的父节点。 4. 将错误节点从原位置删除,并插入到正确的位置。 ```java Element errorParent = errorNode.getParent(); errorParent.remove(errorNode); parentNode.add(errorNode); ``` 这里,先从原位置删除错误节点,然后将其插入到正确的位置。 完整代码示例: ```java import java.io.File; import java.util.HashMap; import java.util.List; import java.util.Map; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class XsdAdjuster { public static void main(String[] args) throws Exception { SAXReader reader = new SAXReader(); Document xsdDoc = reader.read(new File("schema.xsd")); Element root = xsdDoc.getRootElement(); Map<String, Element> elementMap = new HashMap<>(); getElementMap(elementMap, root); Document xmlDoc = reader.read(new File("data.xml")); Element errorNode = (Element)xmlDoc.selectSingleNode("//error"); String errorPath = errorNode.getUniquePath(); String parentPath = errorPath.substring(0, errorPath.lastIndexOf("/")); Element parentNode = elementMap.get(parentPath); Element errorParent = errorNode.getParent(); errorParent.remove(errorNode); parentNode.add(errorNode); System.out.println(xmlDoc.asXML()); } private static void getElementMap(Map<String, Element> elementMap, Element element) { elementMap.put(element.getUniquePath(), element); List<Element> elements = element.elements(); for (Element child : elements) { getElementMap(elementMap, child); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值