C# 操作XML

示例XMl

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
    <cd country="USA">
        <title>Empire Burlesque</title>
        <artist>Bob Dylan</artist>
        <price>10.90</price>
    </cd>
    <cd country="UK">
        <title>Hide your heart</title>
        <artist>Bonnie Tyler</artist>
        <price>9.90</price>
    </cd>
    <cd country="USA">
        <title>Greatest Hits</title>
        <artist>Dolly Parton</artist>
        <price>9.90</price>
    </cd>
</catalog>

定位节点

XML是树状结构,类似档案系统内数据夹的结构,XPath也类似档案系统的路径命名方式。不过XPath 是一种模式(Pattern),可以选出 XML档案中,路径符合某个模式的所有节点出来。例如要选catalog底下的cd中所有price元素可以用:  /catalog/cd/price

如果XPath的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。以下的语法会选出文件中所有叫做cd的元素(在树中的任何层级都会被选出来):  //cd

选择未知的元素

使用星号(Wildcards,*)可以选择未知的元素。下面这个语法会选出/catalog/cd 的所有子元素:  /catalog/cd/*

选出有两层父节点,叫做price的所有元素:  price

选择出文件中的所有元素: //*

要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。

选择分支

使用中括号可以选择分支。以下的语法从catalog的子元素中取出第一个叫做cd的元素。XPath的定义中没有第0元素这种东西:  /catalog/cd[1]

选择catalog中的最后一个cd元素:(XPath并没有定义 first() 这种函式喔,用上例的 [1]就可以取出第一个元素:  /catalog/cd[last()]

选出含有price子元素的所有/catalog/cd元素:    /catalog/cd[price]

选出price元素的值等于10.90的所有/catalog/cd元素:  /catalog/cd[price=10.90]

选出price元素的值等于10.90的所有/catalog/cd元素 的price元素:  /catalog/cd[price=10.90]/price

选择一个以上的路径

使用Or操作数(|)就可以选择一个以上的路径。例如:/catalog/cd/title | catalog/cd/artist

选择所有title以及artist元素:  //title | //artist

选择所有title以及artist以及price元素

//title | //artist | //price

选择属性

在XPath中,除了选择元素以外,也可以选择属性。属性都是以@开头。例如选择文件中所有叫做country的属性:  //@country

选择所有含有country这个属性的cd元素:

//cd[@country]

以下语法选择出含有属性的所有cd元素

//cd[@*]

以下语法选择出country属性值为UK的cd元素

//cd[@country='UK']

只要掌握了xpath语法,理论上你就可以访问xml文件中的任意节点和任意值

XmlNode xmlnode = xmldoc.SelectSingleNode("//document/section[@id='pla-01']/data[@id='fou_scc_code']");

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
    <book>
        <title lang="eng">Harry Potter</title>
        <price>29.99</price>
    </book>
    <book>
        <title lang="eng">Learning XML</title>
        <price>39.95</price>
    </book>
</bookstore>
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。
注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。
通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。
路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。
路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

VS2008编译WinCE程序过慢解决办法

VS2008环境下采用C#、.NET Compact Framework开发WinCE、Windows Mobile程序时,编译项目非常慢,有时候需要几分钟甚至十几分钟,如果出现这种情况,除了排除机器配置问题外,你可以修改VS的配置文件,以屏蔽掉编译中不需要的任务,这个修改可以让你的编译速度大大提高,有可能你的编译时间只需要几秒钟就搞定了啊。

1、找到以下文件

%windir%\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.Common.targets

2、用记事本打开该文件,找到以下节点,在target树节点上增加 Condition="'$(SkipPlatformVerification)' == 'true'" 修改后的内容如下。

<Target Name="PlatformVerificationTask" Condition="'$(SkipPlatformVerification)' == 'true'" >
  <PlatformVerificationTask
    PlatformFamilyName="$(PlatformFamilyName)"
    PlatformID="$(PlatformID)"
    SourceAssembly="@(IntermediateAssembly)"
    ReferencePath="@(ReferencePath)"
    TreatWarningsAsErrors="$(TreatWarningsAsErrors)"
    PlatformVersion="$(TargetFrameworkVersion)"/>
</Target>

具体可以参考:https://blogs.msdn.microsoft.com/vsdteam/2006/09/15/platform-verification-task/

Spring AOP

一、概念

AOP(Aspect Oriented Programming):面向切面编程。

面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

二、用途

  • 日志记录
  • 性能统计
  • 安全控制
  • 权限管理
  • 事务处理
  • 异常处理
  • 资源池管理

三、详解

1. 切面(Aspect)

官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例如:AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。“切面”在ApplicationContext中<aop:aspect>来配置。

2.连接点(Joinpoint)

程序执行过程中的某一行为,例如,AServiceImpl.barA()的调用或者BServiceImpl.barB(String _msg, int _type)抛出异常等行为。

3. 通知(Advice)

“切面”对于某个“连接点”所产生的动作,例如,TestAspect中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面”可以包含多个“Advice”,例如TestAspect。Advice共有如下5种类型:

  • 前置通知(Before advice) :
    在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。xml中在<aop:aspect>里面使用<aop:before>元素进行声明;例如,TestAspect中的doBefore方法。注解中使用@Before声明;例如,TestAnnotationAspect中的doBefore方法。
  • 后通知(After advice) :
    当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。xml中在<aop:aspect>里面使用<aop:after>元素进行声明。例如,TestAspect中的doAfter方法,所以AOPTest中调用BServiceImpl.barB抛出异常时,doAfter方法仍然执行。注解中使用@After声明。
  • 返回后通知(After return advice) :
    在某连接点正常完成后执行的通知,不包括抛出异常的情况。xml中在<aop:aspect>里面使用<after-returning>元素进行声明。注解中使用@AfterReturning声明;
  • 环绕通知(Around advice) :
    包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。xml中在<aop:aspect>里面使用<aop:around>元素进行声明。例如,TestAspect中的doAround方法。注解中使用@Around声明。
  • 抛出异常后通知(After throwing advice) :
    在方法抛出异常退出时执行的通知。xml中在<aop:aspect>里面使用<aop:after-throwing>元素进行声明。例如,TestAspect中的doThrowing方法。注解中使用@AfterThrowing声明。

通知执行顺序:前置通知→环绕通知连接点之前→连接点执行→环绕通知连接点之后→返回通知→(如果发生异常)异常通知→后通知
Read more

SpringBoot后台运行配置

SpringBoot的几种运行方式

  • 运行Spring Boot的应用主类
  • 使用Maven的Spring Boot插件mvn spring-boot:run来运行
  • 打成jar包后,使用java -jar运行

程序打包

mvn install
mvn install

mvn install

windows下运行

windows 下运行

windows 下使用命令行运行

使用java -jar xxxx.jar 运行

Linux/Unix

使用nohup运行

nohup java -jar mytools-0.0.1-SNAPSHOT.jar > mytools.log 2>&1 &

nohup后台运行

查看程序是否成功运行

lsof -i:80

Spring/SpringMVC/MyBatis注解备忘录

Spring


@Autowired

自动装配,其作用是为了消除java代码里面的getter/setter与bean属性中的property。@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

@Qualifier(指定注入Bean的名称)

如果一个容器有一个以上匹配的Bean,则可以使用@Qualifier注解限定Bean的名称。

@Resource

与@Autowired类似,默认通过name属性去匹配Bean,找不到再按type去匹配,指定了name或者type则根据指定类型去匹配Bean

@Service

标注业务层组件

@Controller

标注控制层组件

@Repository

标注数据访问层组件(即Dao组件)

@Component

泛指组件,当组件不好归类的时候,可以使用这个组件进行标注

@Configuration

把这个类作为一个Ioc容器,它的某个方法头上如果注册了@Bean,就会作为这个Spring容器中的Bean。

@Scope

作用域(常用来设置该类是否为单例或多例)

@Lazy

表示延迟初始化(Spring默认是延迟加载,如果是工具类,则可以使用它来进行标注容器启动即实例化)

@PostConstruct

用于指定初始化方法(用在方法上)

@PreDestory

用于指定销毁方法(用在方法上)

@DependsOn

定义Bean初始化及销毁时的顺序

@Primary

自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常

@Async

异步方法调用

@EnableScheduling

开启对计划任务的支持

@EnableAspectJAutoProxy

激活Aspect自动代理

@EnableAsync

开启异步方法的支持

@EnableWebMVC

用来开启Web MVC的配置支持

@EnableConfigurationProperties

用来开启对@ConfigurationProperties注解配置Bean的支持

@EnableJpaRepositories

开启对Spring Data JPA Repostory的支持

@EnableTransactionManagement

注解开启注解式事务的支持

@EnableCaching

开启注解式的缓存支持

SpringMVC


@RequestMapping

处理请求地址映射,可用于类或者方法上

@PathVariable

获取Url中的动态参数

@RequestParam

将请求参数绑定到方法参数上

@RequestBody

将HTTP请求正文转换为适合的HttpMessageConverter对象

@ResponseBody

将内容或对象作为 HTTP 响应正文返回,并调用适合HttpMessageConverter的Adapter转换对象,写入输出流

@RestController

这个注解的类会被看作一个controller。controller中使用@RequestMapping的方法有一个默认的@ResponseBody注解。@ResponseBody也可以加到类一级,通过继承方法一级不需要添加。

@ModelAttribute

标明该方法的目的是添加一个或多个模型属性(Model attributes)。@ModelAttribute标注的方法会在@RequestMapping方法调用之前而调用

@SessionAttributes

将值放到Session作用域中,写在Class上面

@CookieValue

cookie 数据到处理器功能处理方法的方法参数上的绑定

@RequestHeader

请求头(header)数据到处理器功能处理方法的方法参数上的绑定

@ResponseStatus

定义处理器功能处理方法/异常处理器返回的状态码和原因

@ExceptionHandler

注解式声明异常处理器

MyBatis


@Insert

插入sql , 和xml insert sql语法完全一样

@Select

查询sql, 和xml select sql语法完全一样

@Update

更新sql, 和xml update sql语法完全一样

@Delete

删除sql, 和xml delete sql语法完全一样

@Param

入参

@Results

结果集合

@Result

结果