xml解析 dom jom 9.5

XML
dom解析
 
 
读取节点
public class DOMDemo {
 public static void main(String[] args) {
  //1. 建立DocumentBuilderFactory  用于获取DocumentBuilder
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  //2. 通过DocumentBuilderFactory 取得DocumentBuilder
  DocumentBuilder builder = null;
  try{
   builder = factory.newDocumentBuilder();
  }catch(Exception e){
   e.printStackTrace();
  }
  //3. 定义document接口对象,通过DocumentBuilder类进行DOM树的转换操作
  Document doc = null;
  try {
   System.out.println(File.separator);
   //读取指定路径的XML文件
   doc = builder.parse("d:" + File.separator + "NewFile.xml");
  } catch (SAXException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  //查找name的节点
  NodeList nl = doc.getElementsByTagName("name");
  System.out.println("姓名:" + nl.item(0).getFirstChild().getNodeValue());
 }
}
 
 
读取多个
NodeList nl = doc.getElementsByTagName("linkman");
  for (int i = 0; i < nl.getLength(); i++) {
   Element e = (Element)nl.item(i);
   System.out.println("姓名:" + e.getElementsByTagName("name").item(0).
     getFirstChild().getNodeValue());
   System.out.println("电话:" + e.getElementsByTagName("tel").item(0).
     getFirstChild().getNodeValue());
  }
 
 
将生成的XML文件输出到文件中
//3. 定义document接口对象,通过DocumentBuilder类进行DOM树的转换操作
  Document doc = null;
  doc = builder.newDocument();
  //4.建立各个操作节点
  Element add = doc.createElement("add");
  Element linkman = doc.createElement("linkman");
  Element name = doc.createElement("name");
  Element email = doc.createElement("email");
  //5. 设置节点的文本内容,即为没一个节点添加文本节点
  name.appendChild(doc.createTextNode("jordan"));
  email.appendChild(doc.createTextNode(" jordan_513@163.com"));
  //6.设置节点关系
  linkman.appendChild(name);
  linkman.appendChild(email);
  add.appendChild(linkman);
  doc.appendChild(add);
  //7.输出文档到文件中
  TransformerFactory tf = TransformerFactory.newInstance();
  Transformer t = null;
  try {
   t= tf.newTransformer();
  } catch (TransformerConfigurationException e1) {
   e1.printStackTrace();
  }
  t.setOutputProperty(OutputKeys.ENCODING,"GBK");
  DOMSource source = new DOMSource(doc);
  StreamResult result = new StreamResult(new File("d:" + File.separator
    + "b.xml"));
  try {
   t.transform(source,result);
  } catch (TransformerException e1) {
   e1.printStackTrace();
  }
 
 

区别

DOM解析

SAX解析

操作

将所有文件读取到内存中形成DOM树,如果文件两过大,则无法使用

顺序读入所需要的文件内容,不会一次性全部读取,不受文件大小的限制

访问限制

DOM树在内存中形成,可以随意存放或读取文件树的任何部分,无次数限制

由于采用部分读取,只能对文件按顺序解析,不支持对文件的随意存放

修改

可以任意修改文件树

只能读取,不能修改

复杂度

易于理解,易于开发

开发上麻烦,还要自己定义事件处理器

对象模型

系统为使用者自动建立DOM,XML对象模型由系统提供

灵活点 可以用SAX建立自己的XML对象模型

 
    DOM适合对文件进行修改和随机存取的操作  不适合对大型文件的操作
    SAX可处理大型文件   可由用户自己建立自己的对象模型
 
 传说中最牛X的解析器  JDOM   综合两个的优点
public class JDOMDemo {
 public static void main(String[] args) {
  Element add = new Element("add");
  Element linkman = new Element("linkman");
  Element name = new Element("name");
  Element email = new Element("email");
  Attribute id = new Attribute("id","lxh");
  Document doc = new Document(add);
  name.setText("jordan");
  email.setText("Michael");
  linkman.addContent(name);
  linkman.addContent(email);
  add.addContent(linkman);
  XMLOutputter out = new XMLOutputter();
  out.setFormat(out.getFormat().setEncoding("GBK"));
  try {
   out.output(doc,new FileOutputStream("D:"+File.separator+ "c.xml"));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
 
读取xml文件里的内容
public static void main(String[] args) throws Exception {
  SAXBuilder builder = new SAXBuilder();
  Document read_doc = builder.build("D:"+File.separator+ "c.xml");
  Element stu = read_doc.getRootElement();
  List list = stu.getChildren("linkman");
  for(int i = 0; i<list.size();i++){
   Element e = (Element)list.get(i);
   String name = e.getChildText("name");
   String id = e.getChild("name").getAttribute("id").getValue();
   String email = e.getChildText("email");
   System.out.println("------联系人----------");
   System.out.println("姓名:" + name + ",编号:" + id);
   System.out.println("Email:" + email);
   System.out.println("------------");
   System.out.println();
  }
 }
### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值