8. 解析XML

8.1 问题

应用程序需要解析从API或其他资源返回的XML格式的响应结果。

8.2 解决方案

(API Level 1)
可以通过实现org.xml.sax.helpers.DefaultHandler的一个子类来解析数据,它使用的是基于事件的SAX方式(Simple API for XML)。android有三种用于解析XML数据的主要方式:DOM(文档对象模型)、SAX和Pull。这其中最容易实现的就是SAX解析器,它也是内存效率最高的。SAX解析通过遍历XML数据来实现,并在每个元素的开头和结尾产生回调事件。

8.3 实现机制

为了进一步介绍如何解析XML,先来看一下请求RSS/ATOM新闻源时返回的XML格式数据(参见以下代码)。

RSS基本结构


    
        
            
            
            
        
        
            
            
            
        
        ...
    

在各组、<link>和<description>标签之间就是每个项的值。我们可以使用SAX将这段数据解析成一个项数组,应用程序可以很方便地在列表中将数据呈现给用户(参见以下代码):</p> <p><strong>自定义的RSS解析处理程序</strong></p> <pre><code>public class RSSHandler extends DefaultHandler { public class NewsItem { public String title; public String link; public String description; @Override public String toString() { return title; } } private StringBuffer buf; private ArrayList<NewsItem> feedItems; private NewsItem item; private boolean inItem = false; public ArrayList<NewsItem> getParsedItems() { return feedItems; } //在每个新元素开始时调用 @Override public void startElement(String uri, String name, String qName, Attributes atts) { if("channel".equals(name)) { feedItems = new ArrayList<NewsItem>(); } else if("item".equals(name)) { item = new NewsItem(); inItem = true; } else if("title".equals(name) && inItem) { buf = new StringBuffer(); } else if("link".equals(name) && inItem) { buf = new StringBuffer(); } else if("description".equals(name) && inItem) { buf = new StringBuffer(); } } //在每个元素结束时调用 @Override public void endElement(String uri, String name, String qName) { if("item".equals(name)) { feedItems.add(item); inItem = false; } else if("title".equals(name) && inItem) { item.title = buf.toString(); } else if("link".equals(name) && inItem) { item.link = buf.toString(); } else if("description".equals(name) && inItem) { item.description = buf.toString(); } buf = null; } //调用元素中的字符数据 @Override public void characters(char ch[], int start, int length) { //Don't bother if buffer isn't initialized if(buf != null) { for (int i=start; i<start+length; i++) { buf.append(ch[i]); } } } } </code></pre> <p>在每个元素开始和结束时都会通过startElement()方法通过RSSHandler。在这之间,组成元素值的字符会传递给character()回调方法。当解析器遍历文档,会产生如下步骤:<br> (1)当解析器碰到第一个元素时,会初始化项列表。<br> (2)对于遇到的每个项元素,会初始化一个新的NewsItem模型。<br> (3)在每个项元素的内部,数据元素被置入一个StringBuffer中,然后插入NewsItem的成员中。<br> (4)当到达每个项的结尾时,会把NewsItem添加到列表中。<br> (5)解析完成后,feedItems中包含了源数据中的所有项。<br> 接下来,使用第6节的API示例中介绍的一些技巧来下载最新的RSS格式的Google新闻内容(参见以下代码)。</p> <p><strong>解析XML并显示各个项内容的Activity</strong></p> <pre><code>public class FeedActivity extends Activity implements ResponseCallback { private static final String TAG = "FeedReader"; private static final String FEED_URI = "http://news.google.com/?output=rss"; private ListView mList; private ArrayAdapter<NewsItem> mAdapter; private ProgressDialog mProgress; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mList = new ListView(this); mAdapter = new ArrayAdapter<NewsItem>(this, android.R.layout.simple_list_item_1, android.R.id.text1); mList.setAdapter(mAdapter); mList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { NewsItem item = mAdapter.getItem(position); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(item.link)); startActivity(intent); } }); setContentView(mList); } @Override public void onResume() { super.onResume(); //获取RSS源数据 try{ RestTask task = RestUtil.obtainGetTask(FEED_URI); task.setResponseCallback(this); task.execute(); mProgress = ProgressDialog.show(this, "Searching", "Waiting For Results...", true); } catch (Exception e) { Log.w(TAG, e); } } @Override public void onRequestSuccess(String response) { if (mProgress != null) { mProgress.dismiss(); mProgress = null; } //处理响应数据 try { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser p = factory.newSAXParser(); RSSHandler parser = new RSSHandler(); p.parse(new InputSource(new StringReader(response)), parser); mAdapter.clear(); for(NewsItem item : parser.getParsedItems()) { mAdapter.add(item); } mAdapter.notifyDataSetChanged(); } catch (Exception e) { Log.w(TAG, e); } } @Override public void onRequestError(Exception error) { if (mProgress != null) { mProgress.dismiss(); mProgress = null; } //显示错误 mAdapter.clear(); mAdapter.notifyDataSetChanged(); Toast.makeText(this, error.getMessage(), Toast.LENGTH_SHORT).show(); } } </code></pre> <p>这个示例修改之后会显示一个ListView,其中的数据就是从RSS源解析出来的。在这个示例中,我们为列表添加一个OnItemClickListener,用户点击时会在浏览器中加载新闻项的链接。<br> 当数据从API的响应回调方法返回时,Android内置的SAX解析器会遍历XML字符串。SAXParser.parse()会使用RSSHandler的实例来处理XML,从XML中解析的内容会用来填充RSSHandler的feedItems列表。接收器在逐个处理解析出来的项,将其添加到ArrayAdapter中,最终显示在ListView中。</p> <p><strong>XMLPullParser</strong></p> <p>由框架提供的XmlPullParser是另一种高效解析传入的XML数据的方式。和SAX一样,解析过程也是基于流的,由于解析开始之前并不需要加载整个XML数据结构,因此在解析大文档源时也就不需要太多的内存。下面让我们看一下使用XmlPullParser解析RSS源数据的实例。但与SAX不同,我们必须手动地干预每一步的数据流解析过程,即使是我们不感兴趣的标签元素。<br> 以下代码包含一个工厂类,它会迭代源数据以构造元素模型。</p> <p><strong>用来将XML解析成模型对象的工厂类</strong></p> <pre><code>public class NewsItemFactory { /* 数据模型类 */ public static class NewsItem { public String title; public String link; public String description; @Override public String toString() { return title; } } /* * 将 RSS 源解析为一个NewsItem 元素的列表 */ public static List<NewsItem> parseFeed(XmlPullParser parser) throws XmlPullParserException, IOException { List<NewsItem> items = new ArrayList<NewsItem>(); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } if (parser.getName().equals("rss") || parser.getName().equals("channel")) { //跳过这些元素,但允许解析它们内部的元素 } else if (parser.getName().equals("item")) { NewsItem newsItem = readItem(parser); items.add(newsItem); } else { //跳过其他元素以及它们的子元素 skip(parser); } } //返回解析后的列表 return items; } /* *将每个 <item> 元素解析为一个NewsItem */ private static NewsItem readItem(XmlPullParser parser) throws XmlPullParserException, IOException { NewsItem newsItem = new NewsItem(); //开头必须是有效的 <item> 元素 parser.require(XmlPullParser.START_TAG, null, "item"); while (parser.next() != XmlPullParser.END_TAG) { if (parser.getEventType() != XmlPullParser.START_TAG) { continue; } String name = parser.getName(); if (name.equals("title")) { parser.require(XmlPullParser.START_TAG, null, "title"); newsItem.title = readText(parser); parser.require(XmlPullParser.END_TAG, null, "title"); } else if (name.equals("link")) { parser.require(XmlPullParser.START_TAG, null, "link"); newsItem.link = readText(parser); parser.require(XmlPullParser.END_TAG, null, "link"); } else if (name.equals("description")) { parser.require(XmlPullParser.START_TAG, null, "description"); newsItem.description = readText(parser); parser.require(XmlPullParser.END_TAG, null, "description"); } else { //跳过其他元素以及它们的子元素 skip(parser); } } return newsItem; } /* * 读取当前元素的文本内容,该内容start和end标签之间包含的数据 */ private static String readText(XmlPullParser parser) throws IOException, XmlPullParserException { String result = ""; if (parser.next() == XmlPullParser.TEXT) { result = parser.getText(); parser.nextTag(); } return result; } /* * 辅助方法,用来跳过当前元素以及该元素的子元素 */ private static void skip(XmlPullParser parser) throws XmlPullParserException, IOException { if (parser.getEventType() != XmlPullParser.START_TAG) { throw new IllegalStateException(); } /* * 对于每个新标签,会把一个depth计数器加1。到达每个标签的结尾时会把 * 计时器减1并且在end标签与开始时的标签匹配时会返回 */ int depth = 1; while (depth != 0) { switch (parser.next()) { case XmlPullParser.END_TAG: depth--; break; case XmlPullParser.START_TAG: depth++; break; } } } } </code></pre> <p>Pull解析过程的工作原理就是把数据流作为一系列的事件来处理。应用程序通过调用next()方法或该方法的一个或多个指定变体来告诉解析器处理下一个事件。以下是解析器会处理的事件类型:</p> <ul> <li>START_DOCUMENT :当解析器首次初始化时会返回这个事件。在首次调用next()、nextToken()或nextTag()之前,解析器都会是这个状态。</li> <li>START_TAG :解析器刚刚读取标签元素的开始部分。标签的名称可以通过getName()获得,里面的任何属性也可以通过getAttributeValue()和相关的方法获得。</li> <li>TEXT :读取标签元素内部的字符数据,可以通过getText()获取。</li> <li>END_TAG :解析器刚刚读取标签元素的结尾部分。和它相匹配的开始标签的名称可以通过getName()获得。</li> <li>END_DOCUMENT :表明到达了数据量的结尾。</li> </ul> <p>由于必须自己操作解析器,因此我们创建了一个辅助方法skip(),它可以帮助解析器跳过我们不感兴趣的标签。这个方法从当前位置开始遍历所有的内嵌子元素,直到找到匹配的结束标签,并把它们全部跳过。这里使用了一个depth计数器,碰到每个开始标签时会递增,碰到每个结束标签时会递减。当depth计数器到达0时,我们就找到了与开始位置相匹配的结束标签了。<br> 本例中,在调用parseFeed()方法时,解析器首先会迭代数据流来查找可以转换为NewsItem的<item>标签。除了<rss>和<channel>,所有不是<item>的元素都可以跳过。这是因为所有的项都是内嵌在这两个标签之中的,因此即使我们对它们不直接感兴趣,也不能把它们交给skip()处理,否则所有的项都会被跳过。<br> 分析每个<item>元素的工作是由readItem()方法完成的,它会构造一个新的NewsItem,该NewsItem的内容来自于<item>内部的数据。readItem()方法首先会调用require(),它是一种安全性检查能够确保XML是我们希望的格式。如果当前的解析器事件和传入的命名空间、标签名称相匹配的话,这个方法会静默地返回;否则,它会抛出异常。当我们遍历子元素时,我们主要查找title、link和description标签,这样就可以把它们的值读取到模型数据中。查找到所需的标签后,readText()会操作解析器并把相关字符数据取出。同样,在<item>内部有一些其他元素我们并没有解析,对于不需要的标签只需要调用skip()即可。<br> 可见XmlPullParser非常灵活,原因是可控制整个过程的每一步,但这也要求写更多的代码来完成相同的结果。以下代码清单展示了使用新的解析器来完成源数据显示的Activity。</p> <p><strong>显示解析的XML源的Activity</strong></p> <pre><code>public class PullFeedActivity extends Activity implements ResponseCallback { private static final String TAG = "FeedReader"; private static final String FEED_URI = "http://news.google.com/?output=rss"; private ListView mList; private ArrayAdapter<NewsItem> mAdapter; private ProgressDialog mProgress; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mList = new ListView(this); mAdapter = new ArrayAdapter<NewsItem>(this, android.R.layout.simple_list_item_1, android.R.id.text1); mList.setAdapter(mAdapter); mList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { NewsItem item = mAdapter.getItem(position); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse(item.link)); startActivity(intent); } }); setContentView(mList); } @Override public void onResume() { super.onResume(); //获取RSS 源数据 try{ RestTask task = RestUtil.obtainGetTask(FEED_URI); task.setResponseCallback(this); task.execute(); mProgress = ProgressDialog.show(this, "Searching", "Waiting For Results...", true); } catch (Exception e) { Log.w(TAG, e); } } @Override public void onRequestSuccess(String response) { if (mProgress != null) { mProgress.dismiss(); mProgress = null; } //处理响应数据 try { XmlPullParser parser = Xml.newPullParser(); parser.setInput(new StringReader(response)); //跳过第一个标签 parser.nextTag(); mAdapter.clear(); for(NewsItem item : NewsItemFactory.parseFeed(parser)) { mAdapter.add(item); } mAdapter.notifyDataSetChanged(); } catch (Exception e) { Log.w(TAG, e); } } @Override public void onRequestError(Exception error) { if (mProgress != null) { mProgress.dismiss(); mProgress = null; } //显示错误 mAdapter.clear(); mAdapter.notifyDataSetChanged(); Toast.makeText(this, error.getMessage(), Toast.LENGTH_SHORT).show(); } } </code></pre> <p>使用Xml.newPullParser()可以实例化一个新的XmlPullParser,通过setInput()可以将数据源的输入流作为一个Reader。本例中,从Web服务器返回的数据已经是字符串了,所以我们把它封装成一个StringReader来让解析器解析。我们可以把解析器传给NewsItemFactory,之后会返回NewsItem元素的列表,我们把它添加到ListAdapter中,然后像之前那样显示出来。</p> <p><strong>提示:</strong><br> 还可以使用XmlPullParser解析应用程序中绑定的本地XML数据。把你的原始XML放到资源文件中(如res/xml),然后你就可以实例化一个XmlResourceParser,它会使用Resourse.getXml()预加载你的本地数据。</p> </article> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1731126586272460800"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(8. 解析XML)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1892412673446965248.htm" title="pythonxml模块高级用法_Python minidom模块用法示例【DOM写入和解析XML】" target="_blank">pythonxml模块高级用法_Python minidom模块用法示例【DOM写入和解析XML】</a> <span class="text-muted">Lucy-露西娅</span> <a class="tag" taget="_blank" href="/search/pythonxml%E6%A8%A1%E5%9D%97%E9%AB%98%E7%BA%A7%E7%94%A8%E6%B3%95/1.htm">pythonxml模块高级用法</a> <div>本文实例讲述了Pythonminidom模块用法。分享给大家供大家参考,具体如下:一、DOM写XML文件#-*-coding:utf-8-*-#!python3#导入minidomfromxml.domimportminidom#1.创建DOM树对象dom=minidom.Document()#2.创建根节点。每次都要用DOM对象来创建任何节点。root_node=dom.createElemen</div> </li> <li><a href="/article/1892408765760729088.htm" title="XML的介绍及使用DOM,DOM4J解析xml文件" target="_blank">XML的介绍及使用DOM,DOM4J解析xml文件</a> <span class="text-muted">late summer182</span> <a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1XML简介XML(可扩展标记语言,ExtensibleMarkupLanguage)是一种用于定义文档结构和数据存储的标记语言。它主要用于在不同的系统之间传输和存储数据。作用:数据交互配置应用程序和网站Ajax基石特点XML与操作系统、编程语言的开发平台无关实现不同系统之间的数据交换2XML文档结构王珊.NET高级编程包含C#框架和网络编程等李明明XML基础编程包含XML基础概念和基本作用2.1</div> </li> <li><a href="/article/1892406744987004928.htm" title="《Java高级-Xml:利用DOM4j解析XML》" target="_blank">《Java高级-Xml:利用DOM4j解析XML》</a> <span class="text-muted">大大大钢琴</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Java%EF%BC%9A%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/1.htm">Java:经验总结</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>利用DOM4j解析XMLdom4j是一个简单的开源库,用于处理XML、XPath和XSLT,它基于Java平台,使用Java的集合框架,全面集成了DOM,SAX和JAXP。dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XMLSchema支持以及用于大文档或流化文档</div> </li> <li><a href="/article/1892190460999430144.htm" title="如何使用qt开发一个xml发票浏览器,实现按发票样式显示" target="_blank">如何使用qt开发一个xml发票浏览器,实现按发票样式显示</a> <span class="text-muted">zhencon-com</span> <a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E9%AA%8C%E5%88%86%E4%BA%AB/1.htm">经验分享</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E9%87%91%E8%9E%8D/1.htm">金融</a> <div>使用Qt开发一个按发票样式显示的XML发票浏览器,如下图所示样式:一、需求:1、按税务发票样式显示。2、拖入即可显示。3、正确解析xml文件。二、实现可以按照以下步骤进行:1.创建Qt项目打开QtCreator,创建一个新的QtWidgetsApplication项目。设置项目名称和路径,选择合适的Qt版本。2.导入必要的模块在项目的.pro文件中,确保导入了xml模块,以便使用Qt的XML解析功</div> </li> <li><a href="/article/1892096242146668544.htm" title="阿里云百炼通义大模型" target="_blank">阿里云百炼通义大模型</a> <span class="text-muted">The丶Star</span> <a class="tag" taget="_blank" href="/search/deepseek/1.htm">deepseek</a><a class="tag" taget="_blank" href="/search/AI%E5%BA%94%E7%94%A8/1.htm">AI应用</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E9%98%BF%E9%87%8C%E4%BA%91/1.htm">阿里云</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E8%AE%A1%E7%AE%97/1.htm">云计算</a> <div>阿里云百炼通义大模型Partone(阿里云百炼大模型)一、什么是百炼(一)调用大模型二、支持的大模型三、模型总览四、为什么选择百炼?五、开始使用百炼Parttwo一、开发参考二、模型调用(一)通义千问API参考1.文本输入2.流式输出3.图像输入4.视频输入5.工具调用6.联网搜索7.异步调用8.文档理解9.文字提取Partone(阿里云百炼大模型)阿里云百炼通义大模型企业级服务平台,助力企业轻松</div> </li> <li><a href="/article/1892040496440733696.htm" title="最新5万字长文:Docker 100道面试题及参考答案" target="_blank">最新5万字长文:Docker 100道面试题及参考答案</a> <span class="text-muted">大模型大数据攻城狮</span> <a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/eureka/1.htm">eureka</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E5%99%A8/1.htm">容器</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">面试题</a><a class="tag" taget="_blank" href="/search/%E6%B1%82%E8%81%8C/1.htm">求职</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>目录1.什么是Docker?2.解释一下Docker的架构。3.什么是Docker镜像?4.什么是Docker容器?5.什么是DockerRegistry?6.Docker容器有哪些状态?7.解释Docker中的分层存储机制。8.什么是Dockerfile?9.如何构建Docker镜像?10.什么是DockerRegistry?11.如何在Linux上安装Docker?12.如何在Windows上</div> </li> <li><a href="/article/1892020077088272384.htm" title="青少年编程与数学 02-009 Django 5 Web 编程 23课题、安全性" target="_blank">青少年编程与数学 02-009 Django 5 Web 编程 23课题、安全性</a> <span class="text-muted">明月看潮生</span> <a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B8%8E%E6%95%B0%E5%AD%A6/1.htm">编程与数学</a><a class="tag" taget="_blank" href="/search/%E7%AC%AC02%E9%98%B6%E6%AE%B5/1.htm">第02阶段</a><a class="tag" taget="_blank" href="/search/%E9%9D%92%E5%B0%91%E5%B9%B4%E7%BC%96%E7%A8%8B/1.htm">青少年编程</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E4%B8%8E%E6%95%B0%E5%AD%A6/1.htm">编程与数学</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a> <div>青少年编程与数学02-009Django5Web编程23课题、安全性一、安全性安全性的定义安全性的关键方面安全性的实现方法安全性的挑战安全性的最佳实践二、安全漏洞1.注入漏洞2.跨站脚本(XSS)漏洞3.跨站请求伪造(CSRF)漏洞4.不安全的认证和会话管理5.安全配置错误6.不安全的反序列化7.使用含有已知漏洞的组件8.文件上传漏洞9.缓存区溢出10.信息泄露防范措施三、Django项目的安全性</div> </li> <li><a href="/article/1891867938147856384.htm" title="深度揭秘 DeepSeek:2025 最新版,带你从 0 基础到熟练运用" target="_blank">深度揭秘 DeepSeek:2025 最新版,带你从 0 基础到熟练运用</a> <span class="text-muted">小白教程</span> <a class="tag" taget="_blank" href="/search/AI%E5%86%99%E4%BD%9C/1.htm">AI写作</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/AIGC/1.htm">AIGC</a> <div>文章目录前言一、deepseek使用技巧大全下载二、使用步骤1.准备篇:快速上手DeepSeekAI平台2.基础对话篇:有效提问与魔法指令3.效率飞跃篇:文件处理与代码生成4.场景实战篇:解决真实世界问题5.高手进化篇:专业生产力工具6.自我学习能力提升7.编程教练篇:代码入门与面试准备8.创作进阶篇:小说创作与视频脚本总结前言这是一篇关于DeepSeekAI平台使用指南的文章,主要介绍了从注册到</div> </li> <li><a href="/article/1891829702432190464.htm" title="Python类详解" target="_blank">Python类详解</a> <span class="text-muted">apk___</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%B1%BB/1.htm">类</a> <div>目录1.类的基本概念2.定义类3.创建对象4.继承5.多态性6.特殊方法7.类属性与实例属性8.总结Python类是面向对象编程的核心概念,它允许用户定义自己的数据结构和操作这些数据的方法。类是一种将数据(属性)和操作这些数据的函数(方法)封装在一起的方式,从而支持代码的复用、模块化和复杂系统的构建。1.类的基本概念在面向对象编程中,类是一个模板或蓝图,用于创建具有相同特性和行为的对象。每个对象都</div> </li> <li><a href="/article/1891666123527614464.htm" title="第十四章 文件操作" target="_blank">第十四章 文件操作</a> <span class="text-muted">MPCTHU</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>文章目录14.1认识I/O从硬件角度看I/O从软件角度看I/O14.2文件的基本操作思维导图14.2.1打开文件1.`fileName`2.`mode`3.`buffering`4.`encoding`5.`errors`6.`newline`7.`closefd`8.`opener`14.2.2读取文件1.`file.read(size=-1)`2.`file.readline(size=-1)</div> </li> <li><a href="/article/1891604027599286272.htm" title="stm32超声波模块" target="_blank">stm32超声波模块</a> <span class="text-muted">想要成为糕手。</span> <a class="tag" taget="_blank" href="/search/stm32/1.htm">stm32</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/1.htm">嵌入式硬件</a> <div>HC-SR04超声波测距模块资料1.HC-SR04简介HC-SR04是一种常见的超声波测距传感器,它通过超声波反射测量物体的距离,广泛应用于机器人避障、液位测量、物联网设备等领域。2.HC-SR04主要参数工作电压:5VDC工作电流:15mA测量范围:2cm-400cm测距精度:±3mm工作频率:40kHz探测角度:停止计数器计数8.通过计数器的值计算得出超声波测量距离距离公式:高电平持续时间·声</div> </li> <li><a href="/article/1891110176799387648.htm" title="性能测试的类型有哪些?" target="_blank">性能测试的类型有哪些?</a> <span class="text-muted">Feng.Lee</span> <a class="tag" taget="_blank" href="/search/%E6%BC%AB%E8%B0%88%E6%B5%8B%E8%AF%95/1.htm">漫谈测试</a><a class="tag" taget="_blank" href="/search/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7/1.htm">测试工具</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a> <div>目录1.基准测试2.负载测试3.压力测试4.峰值测试5.并发测试6.容积测试7.稳定性测试8.可扩展性测试9.配置测试性能测试是为测量或评估被测软件系统与性能效率相关的特性而实施的一类测试,它关注被测系统在不同负载下的各种性能效率。软件系统的性能效率相关特性的覆盖面非常广泛,包括系统的执行效率、资源占用、系统容量等。性能测试是一个广泛的领域,它包括多种类型的测试,每种类型都有其特定的目标和应用场景</div> </li> <li><a href="/article/1891108914406158336.htm" title="Python爬虫——网站基本信息" target="_blank">Python爬虫——网站基本信息</a> <span class="text-muted">IT·小灰灰</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>在智能时代,数据是新的石油。Python爬虫技术赋予了我们成为数据猎人的能力,让我们能够在网络的广袤土地上狩猎,为机器学习和人工智能的发展提供燃料目录一、介绍——Python二、介绍——Python爬虫1.请求库2.解析库3.数据存储4.多线程/多进程5.异步编程6.代理和反爬虫7.爬虫框架8.爬虫的法律和道德问题9.异常处理10.日志记录三、爬虫示例代码一、介绍——PythonPython是一种</div> </li> <li><a href="/article/1891037938901381120.htm" title="麒麟SoC的详细架构组成介绍" target="_blank">麒麟SoC的详细架构组成介绍</a> <span class="text-muted">小蘑菇二号</span> <a class="tag" taget="_blank" href="/search/%E9%BA%92%E9%BA%9F/1.htm">麒麟</a> <div>目录麒麟SoC的主要组成部分1.应用处理器(ApplicationProcessor,AP)2.图形处理单元(GPU)3.神经网络处理单元(NPU)4.图像信号处理器(ISP)5.调制解调器(Modem,基带芯片)6.多媒体编解码器7.安全模块8.连接模块9.存储控制器10.电源管理单元(PMIC)典型麒麟SoC示例Kirin9000总结麒麟(Kirin)是华为自主研发的一系列高性能系统级芯片(S</div> </li> <li><a href="/article/1890958245569294336.htm" title="揭秘!100 个 Python 常用易错知识点的避坑指南" target="_blank">揭秘!100 个 Python 常用易错知识点的避坑指南</a> <span class="text-muted">tekin</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E6%98%93%E9%94%99%E7%82%B9/1.htm">易错点</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E9%81%BF%E5%9D%91/1.htm">编程避坑</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E6%80%BB%E7%BB%93/1.htm">知识总结</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80%E4%B8%8E%E8%BF%9B%E9%98%B6/1.htm">基础与进阶</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E4%BB%A3%E7%A0%81%E4%BC%98%E5%8C%96/1.htm">代码优化</a><a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/%E5%B8%B8%E8%A7%81%E9%94%99%E8%AF%AF%E8%A7%A3%E6%9E%90/1.htm">常见错误解析</a> <div>目录简介1.类方法命名中的下划线2.函数形参中的*和**3.函数实参中的*4.变量作用域5.浅拷贝和深拷贝6.默认参数的陷阱7.迭代器和生成器相关迭代器使用后耗尽生成器表达式和列表推导式混淆8.异常处理相关捕获异常范围过大异常处理中的finally子句9.多线程和多进程相关全局解释器锁(GIL)误解多线程性能提升多进程中的资源共享问题10.字符串编码问题编码和解码错误11.模块导入相关循环导入问题</div> </li> <li><a href="/article/1890942729731502080.htm" title="如何使用Three.js制作3D月球与星空效果" target="_blank">如何使用Three.js制作3D月球与星空效果</a> <span class="text-muted">软件工程师文艺</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/3d/1.htm">3d</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>目录1.基本设置2.创建星空效果3.创建月球模型4.添加中文3D文字5.光照与相机配置6.动画与控制7.响应式布局8.结语在本文中,我们将一起学习如何利用Three.js实现一个3D月球与星空的效果,并添加一些有趣的元素,比如中文3D文字和互动功能。Three.js是一个强大的JavaScript库,它简化了WebGL的使用,使得在网页上进行3D图形渲染变得更加容易。我们将逐步分析代码,帮助大家理</div> </li> <li><a href="/article/1890884094263357440.htm" title="Unity的基础程序框架" target="_blank">Unity的基础程序框架</a> <span class="text-muted">染-青</span> <a class="tag" taget="_blank" href="/search/Unity/1.htm">Unity</a><a class="tag" taget="_blank" href="/search/unity/1.htm">unity</a> <div>基础程序框架前言一、为什么要做这些二、包含内容1.单例模式基类2.缓存池模块3.事件中心模块4.公共Mono模块5.场景切换模块、6.资源加载模块7.输入控制模块8.音效管理模块9.UI模块10.数据管理模块前言完成所有项目都有的公共模块。使用这些框架可以做一些小项目或者毕业设计。一、为什么要做这些1、公共模块可以简单的理解为整个程序框架,提升开发效率2、这些模块在游戏中各处都会用到3、往往这些模</div> </li> <li><a href="/article/1890803402665947136.htm" title="JS考核题" target="_blank">JS考核题</a> <span class="text-muted">非星</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>JS考核题第一题-写出下列输出1.typeof(typeofA);2.typeof({})3.typeof(null)4.(false=='')5.(NaN==NaN)6.(null==undefined)7.(null===undefined)8.(0=='')9.("20"+20)10.(10+10+"20")答案1.string//typeof函数的返回值为字符串类型2.object3.ob</div> </li> <li><a href="/article/1890689037434417152.htm" title="stata软件不出图_[求助]stata8画图总是画不出来,不知道为什么?请指点" target="_blank">stata软件不出图_[求助]stata8画图总是画不出来,不知道为什么?请指点</a> <span class="text-muted">weixin_39911998</span> <a class="tag" taget="_blank" href="/search/stata%E8%BD%AF%E4%BB%B6%E4%B8%8D%E5%87%BA%E5%9B%BE/1.htm">stata软件不出图</a> <div>+-------------+|x1x2||-------------|1.|2.61.67|2.|3.241.98|3.|3.731.98|4.|4.322.34|5.|4.732.5||-------------|6.|5.183.6|7.|5.583.73|8.|5.784.14|9.|6.44.17|10.|6.534.57|+-------------+graphx1x2(note:sc</div> </li> <li><a href="/article/1890674646508957696.htm" title="ImageJ用户手册——第二部分(ImageJ操作)" target="_blank">ImageJ用户手册——第二部分(ImageJ操作)</a> <span class="text-muted">用数据说话用数据决策</span> <a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/microsoft/1.htm">microsoft</a> <div>mageJ用户手册-第二部分ImageJ的使用4.使用键盘快捷键5.查找命令6.撤消和重做7.图像类型和格式原生格式非原生格式8.堆栈、虚拟堆栈、超堆栈Stacks(堆栈)VirtualStacks(虚拟堆栈)Hyperstacks(超堆栈)9.彩色图像伪彩色图像真彩色图像颜色空间和颜色分离传送颜色信息彩色合成图像10.选区10.1操作选区10.2组合选区10.3具有亚像素坐标的选区插值选区11.</div> </li> <li><a href="/article/1890472620487405568.htm" title="【开发工具】开发一个类postman的idea插件" target="_blank">【开发工具】开发一个类postman的idea插件</a> <span class="text-muted">问道飞鱼</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7%E7%9F%A5%E8%AF%86/1.htm">开发工具知识</a><a class="tag" taget="_blank" href="/search/postman/1.htm">postman</a><a class="tag" taget="_blank" href="/search/intellij-idea/1.htm">intellij-idea</a><a class="tag" taget="_blank" href="/search/lua/1.htm">lua</a> <div>类postman的idea插件开发开发过程1.环境准备2.创建插件项目3.项目结构4.编写`plugin.xml`5.创建ToolWindow6.设计UI7.处理HTTP请求8.构建和运行插件9.测试插件10.打包和发布总结相关文献开发过程开发一个类似Postman的IntelliJIDEA插件涉及多个步骤,包括插件项目初始化、UI设计、HTTP请求处理、响应展示等。以下是一个简化的开发过程和代码</div> </li> <li><a href="/article/1890421304096518144.htm" title="C#上位机开发-2-串口通信" target="_blank">C#上位机开发-2-串口通信</a> <span class="text-muted">白熊~</span> <a class="tag" taget="_blank" href="/search/C%23%E4%B8%8A%E4%BD%8D%E6%9C%BA%E5%BC%80%E5%8F%91/1.htm">C#上位机开发</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a> <div>C#上位机开发-2-串口通信文章目录C#上位机开发-2-串口通信前言一、窗口组件1.组件2.界面布局二、事件部分1.窗体初始加载2.串口开关3.COM端口扫描4.串口接受函数5.发送内容6.清除发送内容7.清除接受内容8.自动发送内容9.定时器处理总结前言使用c#加visualstudio制作一个简单的串口通信软件。一、窗口组件1.组件panellabelbuttontextboxnumericU</div> </li> <li><a href="/article/1890177699062804480.htm" title="FastAPI最佳的实践及编码约定资料" target="_blank">FastAPI最佳的实践及编码约定资料</a> <span class="text-muted">FFFPAG</span> <a class="tag" taget="_blank" href="/search/FastApi/1.htm">FastApi</a><a class="tag" taget="_blank" href="/search/fastapi/1.htm">fastapi</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/idea/1.htm">idea</a> <div>目录1.项目结构2.Pydantic数据验证3.数据验证与数据库的依赖关系4.链式依赖5.解耦和重用依赖关系,依赖项调用被缓存6.RestfulAPI规则7.如果你只有阻塞I/O操作,不要让你的路由异步8.从0开始创建基础模型9.编写代码文档10.使用Pydantic的BaseSettings进行配置11.SQLAlchemy:设置数据库键命名约定12.Alembic的数据库迁移13.设置数据库命</div> </li> <li><a href="/article/1890159025182535680.htm" title="java后端研发经典面试题总结二" target="_blank">java后端研发经典面试题总结二</a> <span class="text-muted">Netty711</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>四种读取XML文件读取的办法1.DOM生成和解析XML文档为XML文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构。优点:整个文档树在内存中,便于操作;支持删除,修改,重新排列等。缺点:把整个文档调入内存,存在很多无用的节点,浪费了时间和空间。2.SAX为解决DOM1、边读边解析,应用于大型XML文档2、只支持读3、访问效率低4、顺序访问3.DOM4J生成和解析XM</div> </li> <li><a href="/article/1890103103143866368.htm" title="DeepSeek底层揭秘——知识图谱与语料库的联邦学习架构" target="_blank">DeepSeek底层揭秘——知识图谱与语料库的联邦学习架构</a> <span class="text-muted">9命怪猫</span> <a class="tag" taget="_blank" href="/search/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/1.htm">知识图谱</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>目录1.知识图谱与语料库的联邦学习架构2.技术要素3.技术难点与挑战4.技术路径5.应用场景6.最新研究与技术进展7.未来趋势8.实际案例猫哥说1.知识图谱与语料库的联邦学习架构(1)定义“知识图谱与语料库的联邦学习架构”是一种结合知识图谱(KnowledgeGraph,KG)、语料库(Corpus)和联邦学习(FederatedLearning,FL)的分布式学习框架。其核心目标是通过联邦学习技</div> </li> <li><a href="/article/1889994816809398272.htm" title="oracle-XML解析XMLDOM对象转字符类型&&PLJSON解析所有模型名称" target="_blank">oracle-XML解析XMLDOM对象转字符类型&&PLJSON解析所有模型名称</a> <span class="text-muted">lswsmail</span> <div>这两天有个小需要,摆弄一下oracle-XMLDOM,发现一个极其恶心的问题,就是CLOBvarchar2能转XML,但是反过来不行,硬是在BAIDU里找,唯一有问的一贴好多年前的事了,没有回复,其余的全是垃圾,我找到用法了,给大家共享一下。问题是这样的XML长度超过4000,假设源xml数据是分页的数据结果,想把长度超过4000的XMLDOM对象简单快捷的解析出来,就必须一行/一列分开解析,可是</div> </li> <li><a href="/article/1889941622335008768.htm" title="Python基础入门----Python的编码规范:PEP 8介绍及基本遵循原则" target="_blank">Python基础入门----Python的编码规范:PEP 8介绍及基本遵循原则</a> <span class="text-muted">redrose2100</span> <a class="tag" taget="_blank" href="/search/Python%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9B%E9%98%B6/1.htm">Python从入门到进阶</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>文章目录PEP8简介基本遵循原则1.缩进2.行宽3.空行4.导入5.空格6.命名约定7.表达式和语句中的空格8.注释9.编码声明10.文档字符串PEP8简介PEP8,或PythonEnhancementProposal8,是一个官方文档,发布于2001年。它由GuidovanRossum,Python语言的创始人,以及BarryWarsaw和NickCoghlan等社区成员共同编写。该文档提供了编</div> </li> <li><a href="/article/1889905433372585984.htm" title="Tenserflow学习笔记 【一:Python入门】" target="_blank">Tenserflow学习笔记 【一:Python入门】</a> <span class="text-muted">邪魔小屁屁</span> <a class="tag" taget="_blank" href="/search/%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C%E4%B8%8E%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">神经网络与深度学习</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>Python序列数据结构初习一.前言Python的两种主要的序列数据类型二.关于序列的相关操作1.索引2.切片[开始位置:结束位置]3.获取长度len()4.添加元素①append()②insert(a,b)5.合并列表①extend()②‘+’6.删除元素del6.排序7.遍历序列8.字典①遍历②添加、修改指定元素的取值③合并字典update()④删除字典中的元素9.集合(略)总结一.前言Pyt</div> </li> <li><a href="/article/1889855742245138432.htm" title="图像处理篇---基本OpenMV图像处理" target="_blank">图像处理篇---基本OpenMV图像处理</a> <span class="text-muted">Ronin-Lotus</span> <a class="tag" taget="_blank" href="/search/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E7%AF%87/1.htm">图像处理篇</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6%E7%AF%87/1.htm">嵌入式硬件篇</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/1.htm">图像处理</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/OpenMV/1.htm">OpenMV</a> <div>文章目录前言1.灰度化(Grayscale)2.二值化(Thresholding)3.掩膜(Mask)4.腐蚀(Erosion)5.膨胀(Dilation)6.缩放(Scaling)7.旋转(Rotation)8.平移(Translation)9.边缘检测(EdgeDetection)10.轮廓检测(ContourDetection)11.总结总结前言以上就是今天要讲的内容,本文仅仅简单介绍了Op</div> </li> <li><a href="/article/1889841365966188544.htm" title="Linux运维工程师基础面试题整理(三)" target="_blank">Linux运维工程师基础面试题整理(三)</a> <span class="text-muted">江湖有缘</span> <a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4%E5%B7%A5%E7%A8%8B%E5%B8%88%E9%9D%A2%E8%AF%95%E4%B8%93%E6%A0%8F/1.htm">运维工程师面试专栏</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a> <div>Linux运维工程师基础面试题整理(三)1.文件inode号有什么用?2.文件的权限怎么设置与管理?3.如何SSH免密配置?4.如何快速部署一个web服务?5.如何更新Linux系统内核?6.centos中如何配置本地yum源?7.Linux防火墙如何简单配置?8.有哪些工具可以批量管理Linux服务器?9.Linux服务器怎么做到高可用和负载均衡?10.Linux服务器中数据如何高效备份?11L</div> </li> <li><a href="/article/80.htm" title="java杨辉三角" target="_blank">java杨辉三角</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/java%E5%9F%BA%E7%A1%80/1.htm">java基础</a> <div> package com.algorithm; /** * @Description 杨辉三角 * @author FuJianyong * 2015-1-22上午10:10:59 */ public class YangHui { public static void main(String[] args) { //初始化二维数组长度 int[][] y</div> </li> <li><a href="/article/207.htm" title="《大话重构》之大布局的辛酸历史" target="_blank">《大话重构》之大布局的辛酸历史</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/%E9%87%8D%E6%9E%84/1.htm">重构</a> <div>《大话重构》中提到“大布局你伤不起”,如果企图重构一个陈旧的大型系统是有非常大的风险,重构不是想象中那么简单。我目前所在公司正好对产品做了一次“大布局重构”,下面我就分享这个“大布局”项目经验给大家。   背景         公司专注于企业级管理产品软件,企业有大中小之分,在2000年初公司用JSP/Servlet开发了一套针对中</div> </li> <li><a href="/article/334.htm" title="电驴链接在线视频播放源码" target="_blank">电驴链接在线视频播放源码</a> <span class="text-muted">dubinwei</span> <a class="tag" taget="_blank" href="/search/%E6%BA%90%E7%A0%81/1.htm">源码</a><a class="tag" taget="_blank" href="/search/%E7%94%B5%E9%A9%B4/1.htm">电驴</a><a class="tag" taget="_blank" href="/search/%E6%92%AD%E6%94%BE%E5%99%A8/1.htm">播放器</a><a class="tag" taget="_blank" href="/search/%E8%A7%86%E9%A2%91/1.htm">视频</a><a class="tag" taget="_blank" href="/search/ed2k/1.htm">ed2k</a> <div>本项目是个搜索电驴(ed2k)链接的应用,借助于磁力视频播放器(官网: http://loveandroid.duapp.com/ 开放平台),可以实现在线播放视频,也可以用迅雷或者其他下载工具下载。 项目源码: http://git.oschina.net/svo/Emule,动态更新。也可从附件中下载。 项目源码依赖于两个库项目,库项目一链接: http://git.oschina.</div> </li> <li><a href="/article/461.htm" title="Javascript中函数的toString()方法" target="_blank">Javascript中函数的toString()方法</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/toString/1.htm">toString</a><a class="tag" taget="_blank" href="/search/function/1.htm">function</a><a class="tag" taget="_blank" href="/search/object/1.htm">object</a> <div>简述     The toString() method returns a string representing the source code of the function.     简译之,Javascript的toString()方法返回一个代表函数源代码的字符串。 句法     function.</div> </li> <li><a href="/article/588.htm" title="struts处理自定义异常" target="_blank">struts处理自定义异常</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/struts/1.htm">struts</a> <div>很多时候我们会用到自定义异常来表示特定的错误情况,自定义异常比较简单,只要分清是运行时异常还是非运行时异常即可,运行时异常不需要捕获,继承自RuntimeException,是由容器自己抛出,例如空指针异常。 非运行时异常继承自Exception,在抛出后需要捕获,例如文件未找到异常。 此处我们用的是非运行时异常,首先定义一个异常LoginException: /** * 类描述:登录相</div> </li> <li><a href="/article/715.htm" title="Linux中find常见用法示例" target="_blank">Linux中find常见用法示例</a> <span class="text-muted">510888780</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>Linux中find常见用法示例 ·find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \; find命令的参数;</div> </li> <li><a href="/article/842.htm" title="SpringMVC的各种参数绑定方式" target="_blank">SpringMVC的各种参数绑定方式</a> <span class="text-muted">Harry642</span> <a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a><a class="tag" taget="_blank" href="/search/%E7%BB%91%E5%AE%9A/1.htm">绑定</a><a class="tag" taget="_blank" href="/search/%E8%A1%A8%E5%8D%95/1.htm">表单</a> <div>1. 基本数据类型(以int为例,其他类似): Controller代码: @RequestMapping("saysth.do") public void test(int count) { } 表单代码: <form action="saysth.do" method="post&q</div> </li> <li><a href="/article/969.htm" title="Java 获取Oracle ROWID" target="_blank">Java 获取Oracle ROWID</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div> A ROWID is an identification tag unique for each row of an Oracle Database table. The ROWID can be thought of as a virtual column, containing the ID for each row. The oracle.sql.ROWID class i</div> </li> <li><a href="/article/1096.htm" title="java获取方法的参数名" target="_blank">java获取方法的参数名</a> <span class="text-muted">antlove</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/parameter/1.htm">parameter</a><a class="tag" taget="_blank" href="/search/method/1.htm">method</a><a class="tag" taget="_blank" href="/search/reflect/1.htm">reflect</a> <div>reflect.ClassInformationUtil.java package reflect; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.Modifier; import javassist.bytecode.CodeAtt</div> </li> <li><a href="/article/1223.htm" title="JAVA正则表达式匹配 查找 替换 提取操作" target="_blank">JAVA正则表达式匹配 查找 替换 提取操作</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a><a class="tag" taget="_blank" href="/search/%E6%9B%BF%E6%8D%A2/1.htm">替换</a><a class="tag" taget="_blank" href="/search/%E6%8F%90%E5%8F%96/1.htm">提取</a><a class="tag" taget="_blank" href="/search/%E6%9F%A5%E6%89%BE/1.htm">查找</a> <div>正则表达式的查找;主要是用到String类中的split();       String str;      str.split();方法中传入按照什么规则截取,返回一个String数组   常见的截取规则: str.split("\\.")按照.来截取 str.</div> </li> <li><a href="/article/1350.htm" title="Java中equals()与hashCode()方法详解" target="_blank">Java中equals()与hashCode()方法详解</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/set/1.htm">set</a><a class="tag" taget="_blank" href="/search/equals%28%29/1.htm">equals()</a><a class="tag" taget="_blank" href="/search/hashCode%28%29/1.htm">hashCode()</a> <div>一.equals()方法详解     equals()方法在object类中定义如下:  public boolean equals(Object obj) { return (this == obj); }    很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、I</div> </li> <li><a href="/article/1477.htm" title="精通Oracle10编程SQL(4)使用SQL语句" target="_blank">精通Oracle10编程SQL(4)使用SQL语句</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a> <div>--工资级别表 create table SALGRADE ( GRADE NUMBER(10), LOSAL NUMBER(10,2), HISAL NUMBER(10,2) ) insert into SALGRADE values(1,0,100); insert into SALGRADE values(2,100,200); inser</div> </li> <li><a href="/article/1604.htm" title="【Nginx二】Nginx作为静态文件HTTP服务器" target="_blank">【Nginx二】Nginx作为静态文件HTTP服务器</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/HTTP%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">HTTP服务器</a> <div> Nginx作为静态文件HTTP服务器 在本地系统中创建/data/www目录,存放html文件(包括index.html) 创建/data/images目录,存放imags图片 在主配置文件中添加http指令   http { server { listen 80; server_name </div> </li> <li><a href="/article/1731.htm" title="kafka获得最新partition offset" target="_blank">kafka获得最新partition offset</a> <span class="text-muted">blackproof</span> <a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/partition/1.htm">partition</a><a class="tag" taget="_blank" href="/search/offset/1.htm">offset</a><a class="tag" taget="_blank" href="/search/%E6%9C%80%E6%96%B0/1.htm">最新</a> <div>kafka获得partition下标,需要用到kafka的simpleconsumer   import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.</div> </li> <li><a href="/article/1858.htm" title="centos 7安装docker两种方式" target="_blank">centos 7安装docker两种方式</a> <span class="text-muted">ronin47</span> <div>      第一种是采用yum 方式              yum install -y docker           </div> </li> <li><a href="/article/1985.htm" title="java-60-在O(1)时间删除链表结点" target="_blank">java-60-在O(1)时间删除链表结点</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class DeleteNode_O1_Time { /** * Q 60 在O(1)时间删除链表结点 * 给定链表的头指针和一个结点指针(!!),在O(1)时间删除该结点 * * Assume the list is: * head->...->nodeToDelete->mNode->nNode->..</div> </li> <li><a href="/article/2112.htm" title="nginx利用proxy_cache来缓存文件" target="_blank">nginx利用proxy_cache来缓存文件</a> <span class="text-muted">cfyme</span> <a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a> <div>user  zhangy users; worker_processes 10; error_log  /var/vlogs/nginx_error.log  crit; pid        /var/vlogs/nginx.pid; #Specifies the value for ma</div> </li> <li><a href="/article/2239.htm" title="[JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题" target="_blank">[JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a> <div>     假如我们需要用JWFD的语法分析模块定义一个带负号的方程式,直接在方程式之前添加负号是不正确的,而必须这样做:     string str01 = "a=3.14;b=2.71;c=0;c-((a*a)+(b*b))"     定义一个0整数c,然后用这个整数c去</div> </li> <li><a href="/article/2366.htm" title="如何集成支付宝官方文档" target="_blank">如何集成支付宝官方文档</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>官方文档下载地址 https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash 集成的必要条件 1. 需要有自己的Server接收支付宝的消息 2. 需要先制作app,然后提交支付宝审核,通过后才能集成 调试的时候估计会真的扣款,请注意 </div> </li> <li><a href="/article/2493.htm" title="应该在什么时候使用Hadoop" target="_blank">应该在什么时候使用Hadoop</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>原帖地址:http://blog.chinaunix.net/uid-301743-id-3925358.html 存档,某些观点与我不谋而合,过度技术化不可取,且hadoop并非万能。 --------------------------------------------万能的分割线-------------------------------- 有人问我,“你在大数据和Hado</div> </li> <li><a href="/article/2620.htm" title="在GridView中对于有外键的字段使用关联模型进行搜索和排序" target="_blank">在GridView中对于有外键的字段使用关联模型进行搜索和排序</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a> <div>在GridView中使用关联模型进行搜索和排序 首先我们有两个模型它们直接有关联: class Author extends CActiveRecord { ... } class Post extends CActiveRecord { ... function relations() { return array( '</div> </li> <li><a href="/article/2747.htm" title="使用NSString 的格式化大全" target="_blank">使用NSString 的格式化大全</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/Objective-C/1.htm">Objective-C</a> <div>格式定义The format specifiers supported by the NSString formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you c</div> </li> <li><a href="/article/2874.htm" title="使用activeX插件对象object滚动有重影" target="_blank">使用activeX插件对象object滚动有重影</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/activeX%E6%8F%92%E4%BB%B6/1.htm">activeX插件</a><a class="tag" taget="_blank" href="/search/%E6%BB%9A%E5%8A%A8%E6%9C%89%E9%87%8D%E5%BD%B1/1.htm">滚动有重影</a> <div>  使用activeX插件对象object滚动有重影   <object style="width:0;" id="abc" classid="CLSID:D3E3970F-2927-9680-BBB4-5D0889909DF6" codebase="activex/OAX339.CAB#</div> </li> <li><a href="/article/3001.htm" title="SpringMVC4零配置" target="_blank">SpringMVC4零配置</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/springmvc4/1.htm">springmvc4</a> <div>基于Servlet3.0规范和SpringMVC4注解式配置方式,实现零xml配置,弄了个小demo,供交流讨论。     项目说明如下: 1.db.sql是项目中用到的表,数据库使用的是oracle11g 2.该项目使用mvn进行管理,私服为自搭建nexus,项目只用到一个第三方 jar,就是oracle的驱动; 3.默认项目为零配置启动,如果需要更改启动方式,请</div> </li> <li><a href="/article/3128.htm" title="《开源框架那点事儿16》:缓存相关代码的演变" target="_blank">《开源框架那点事儿16》:缓存相关代码的演变</a> <span class="text-muted">j2eetop</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E6%A1%86%E6%9E%B6/1.htm">开源框架</a> <div>问题引入 上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲。 该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲。 当然去看相关实现代代码的时候,大致是下面的样子。 [java] view plain copy print ? public vo</div> </li> <li><a href="/article/3255.htm" title="AngularJS浅析" target="_blank">AngularJS浅析</a> <span class="text-muted">kvhur</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>概念 AngularJS is a structural framework for dynamic web apps. 了解更多详情请见原文链接:http://www.gbtags.com/gb/share/5726.htm Directive 扩展html,给html添加声明语句,以便实现自己的需求。对于页面中html元素以ng为前缀的属性名称,ng是angular的命名空间</div> </li> <li><a href="/article/3382.htm" title="架构师之jdk的bug排查(一)---------------split的点号陷阱" target="_blank">架构师之jdk的bug排查(一)---------------split的点号陷阱</a> <span class="text-muted">nannan408</span> <a class="tag" taget="_blank" href="/search/split/1.htm">split</a> <div>1.前言.    jdk1.6的lang包的split方法是有bug的,它不能有效识别A.b.c这种类型,导致截取长度始终是0.而对于其他字符,则无此问题.不知道官方有没有修复这个bug. 2.代码 String[] paths = "object.object2.prop11".split("'"); System.ou</div> </li> <li><a href="/article/3509.htm" title="如何对10亿数据量级的mongoDB作高效的全表扫描" target="_blank">如何对10亿数据量级的mongoDB作高效的全表扫描</a> <span class="text-muted">quentinXXZ</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a> <div>  本文链接:  http://quentinXXZ.iteye.com/blog/2149440 一、正常情况下,不应该有这种需求 首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提出来。要知道,对于一般较大数据量的数据库,全表查询,这种操作一般情况下是不应该出现的,在做正常查询的时候,如果是范围查询,你至少应该要加上limit。 说一下,</div> </li> <li><a href="/article/3636.htm" title="C语言算法之水仙花数" target="_blank">C语言算法之水仙花数</a> <span class="text-muted">qiufeihu</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>/** * 水仙花数 */ #include <stdio.h> #define N 10 int main() { int x,y,z; for(x=1;x<=N;x++) for(y=0;y<=N;y++) for(z=0;z<=N;z++) if(x*100+y*10+z == x*x*x</div> </li> <li><a href="/article/3763.htm" title="JSP指令" target="_blank">JSP指令</a> <span class="text-muted">wyzuomumu</span> <a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a> <div> jsp指令的一般语法格式: <%@ 指令名 属性 =”值 ” %> 常用的三种指令: page,include,taglib page指令语法形式: <%@ page 属性 1=”值 1” 属性 2=”值 2”%> include指令语法形式: <%@include file=”relative url”%> (jsp可以通过 include</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>