小编Sha*_*ger的帖子

使用XPath选择XML节点时如何忽略命名空间

我必须解析一个如下所示的XML文档:

 <?xml version="1.0" encoding="UTF-8" ?> 
 <m:OASISReport xmlns:m="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd">
  <m:MessagePayload>
   <m:RTO>
    <m:name>CAISO</m:name> 
    <m:REPORT_ITEM>
     <m:REPORT_HEADER>
      <m:SYSTEM>OASIS</m:SYSTEM> 
      <m:TZ>PPT</m:TZ> 
      <m:REPORT>AS_RESULTS</m:REPORT> 
      <m:MKT_TYPE>HASP</m:MKT_TYPE> 
      <m:UOM>MW</m:UOM> 
      <m:INTERVAL>ENDING</m:INTERVAL> 
      <m:SEC_PER_INTERVAL>3600</m:SEC_PER_INTERVAL> 
     </m:REPORT_HEADER>
     <m:REPORT_DATA>
      <m:DATA_ITEM>NS_PROC_MW</m:DATA_ITEM> 
      <m:RESOURCE_NAME>AS_SP26_EXP</m:RESOURCE_NAME> 
      <m:OPR_DATE>2010-11-17</m:OPR_DATE> 
      <m:INTERVAL_NUM>1</m:INTERVAL_NUM> 
      <m:VALUE>0</m:VALUE> 
     </m:REPORT_DATA>
Run Code Online (Sandbox Code Playgroud)

问题是名称空间"http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd"有时可能会有所不同.我想完全忽略它,只是从标记MessagePayload下游获取我的数据.

我到目前为止使用的代码是:

String[] namespaces = new String[1];
  String[] namespaceAliases = new String[1];

  namespaceAliases[0] = "ns0";
  namespaces[0] = "http://oasissta.caiso.com/mrtu-oasis/xsd/OASISReport.xsd";

  File inputFile = new File(inputFileName);

  Map namespaceURIs = new HashMap();

  // This query will return all of the ASR records.
  String xPathExpression = "/ns0:OASISReport
                             /ns0:MessagePayload
                              /ns0:RTO
                               /ns0:REPORT_ITEM
                                /ns0:REPORT_DATA";
  xPathExpression += "|/ns0:OASISReport
                        /ns0:MessagePayload …
Run Code Online (Sandbox Code Playgroud)

xml xpath namespaces xml-namespaces

55
推荐指数
2
解决办法
8万
查看次数

为什么C++ 17结构化绑定不使用{}?

我在这里找到了*C++结构化绑定的原始提议.它提出了一种轻松绑定多个返回值的方法,即:

auto {a, b} = minmax(data);
Run Code Online (Sandbox Code Playgroud)

但现在我看到每个人都指向C++ 17/C++ 1z提议语法

auto [a, b] = minmax(data);
Run Code Online (Sandbox Code Playgroud)

既然我已经学会了"列表被编写{like,this}",那么会出现一个新的列表语法?为什么?花括号有什么问题?

c++ c++17 structured-bindings

51
推荐指数
4
解决办法
5360
查看次数

Python 3上的dict.keys()[0]

我有这句话:

def Ciudad(prob):
    numero = random.random()
    ciudad = prob.keys()[0]
    for i in prob.keys():
        if(numero > prob[i]):
            if(prob[i] > prob[ciudad]):
                ciudad = i
        else:
            if(prob[i] > prob[ciudad]):
                ciudad = i

    return ciudad
Run Code Online (Sandbox Code Playgroud)

但是当我调用它时,这个错误弹出:

TypeError: 'dict_keys' object does not support indexing
Run Code Online (Sandbox Code Playgroud)

这是版本问题吗?我正在使用Python 3.3.2

python dictionary python-3.x dictview

41
推荐指数
2
解决办法
3万
查看次数

getch和箭头代码

我正在编写一个getch()用于扫描箭头键的程序.到目前为止我的代码是:

switch(getch()) {
    case 65:    // key up
        break;
    case 66:    // key down
        break;
    case 67:    // key right
        break;
    case 68:    // key left
        break;
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我按下'A','B','C''D'代码也将执行,因为65是十进制代码'A',等等.

有没有办法检查箭头键而不打电话给别人?

谢谢!

c character decimal getch arrow-keys

40
推荐指数
3
解决办法
11万
查看次数

64位平台的效率:指针与32位数组索引

在他的一个主题演讲中,Andrei Alexandrescu建议,在64位平台上,使用32位数组索引比使用原始指针更快:

第16页:http://www.slideshare.net/andreialexandrescu1/three-optimization-tips-for-c-15708507

在他的Facebook帐户上,他更精确,并说:"更喜欢数组索引到指针(这个似乎每十年逆转一次)."

我已经尝试了许多方法来找到差异,但我还没有设法构建任何显示这种差异的程序.知道安德烈,我不会感到惊讶,差异不超过百分之几,但如果有人找到这样的例子,我会很高兴.

这是我做过的测试.我选择n = 5000,足够大以获得合适的时序并且足够小以使一切都适合L1缓存.我循环了几次,以便CPU频率上升.

#include <iostream>
#include <chrono>

int main(int argc, const char* argv[]) {
  const int n{5000};
  int* p{new int[n]};

  // Warm up the cache
  for (int i{0}; i < n; i++) {
    p[i] += 1;
  }

  for (int j{0}; j < 5; j++) {
    {
      auto start_pointer = std::chrono::high_resolution_clock::now();
      for (int* q{p}; q != p + n; ++q) {
        ++(*q);
      }
      auto end_pointer = std::chrono::high_resolution_clock::now();
      auto time_pointer = std::chrono::duration_cast<std::chrono::nanoseconds>(
                              end_pointer - …
Run Code Online (Sandbox Code Playgroud)

c++ arrays performance pointers

38
推荐指数
3
解决办法
2805
查看次数

当编译时已知的引用占用结构中的空间时,是否错过了优化?

请参阅以下示例:

struct Foo {
    int a;
    int &b = a;
};
Run Code Online (Sandbox Code Playgroud)

如果错过了优化sizeof(Foo)!=sizeof(int)吗?

我的意思是,编译器可以b从其始终引用的结构中删除它a吗?

有什么阻止编译器进行这种转换的吗?

(请注意,struct Foo看起来是这样。没有构造函数,等等。但是您可以在周围添加任何内容Foo,这表明该优化将违反标准。)

c++ struct initialization reference language-lawyer

27
推荐指数
1
解决办法
1093
查看次数

Python:python中的Splat/unpack运算符*不能用在表达式中?

有没有人知道为什么unary(*)运算符不能用在涉及iterators/lists/tuples的表达式中的原因?

为什么它只限于功能拆包?或者我认为错了?

例如:

>>> [1,2,3, *[4,5,6]]
File "<stdin>", line 1
[1,2,3, *[4,5,6]]
        ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

为什么不是*运营商:

[1, 2, 3, *[4, 5, 6]] give [1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

而当*操作符与函数调用一起使用时,它会扩展:

f(*[4, 5, 6]) is equivalent to f(4, 5, 6)
Run Code Online (Sandbox Code Playgroud)

使用列表时+*使用列表时之间存在相似性,但在使用其他类型扩展列表时则不相似.

例如:

# This works
gen = (x for x in range(10))

def hello(*args):
    print args    
hello(*gen)

# but this does not work
[] + gen
TypeError: can only concatenate …
Run Code Online (Sandbox Code Playgroud)

python argument-unpacking python-2.7 iterable-unpacking pep448

25
推荐指数
2
解决办法
8942
查看次数

尝试执行字符串插值时,Python 3返回"无效语法"

我最近一直在学习python 3,我无法得到任何涉及字符串插值(格式化)的例子.

In [1]: state = "Washington"

In [2]: state
Out[2]: 'Washington'

In [3]: my_message = f"I live in {state}"
File "<ipython-input-3-d004dd9e0255>", line 1
my_message = f"I live in {state}"
                                ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我认为我的机器默认为python 2,但快速检查显示:

Python 3.5.2 (default, Nov 17 2016, 17:05:23) 
Type "copyright", "credits" or "license" for more information.

IPython 5.2.2 -- An enhanced Interactive Python.
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 16.04:

python3 --version
Python 3.5.2
Run Code Online (Sandbox Code Playgroud)

我只是忽略了基本语法?我在同学的几台计算机上运行相同的命令,似乎执行得很好.

python string-interpolation python-3.x ubuntu-16.04

24
推荐指数
2
解决办法
3万
查看次数

傻瓜合并排序的解释

我在网上找到了这个代码:

def merge(left, right):
    result = []
    i ,j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result += left[i:]
    result += right[j:]
    return result

def mergesort(list):
    if len(list) < 2:
        return list
    middle = len(list) / 2
    left = mergesort(list[:middle])
    right = mergesort(list[middle:])
    return merge(left, right)
Run Code Online (Sandbox Code Playgroud)

当我运行它时它100%工作.我只是没有真正了解合并排序的工作原理或递归函数如何正确地排序左右两种.

python sorting algorithm mergesort

20
推荐指数
2
解决办法
2万
查看次数

有没有办法偷看stdin缓冲区?

我们知道stdin默认情况下是缓冲输入; 证据就是使用"保留数据"的任何机制stdin,例如scanf():

int main()
{
    char c[10] = {'\0'};
    scanf("%9s", c);
    printf("%s, and left is: %d\n", c, getchar());
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

./a.out
你好,
你好,左边是10

10 当然是换行...

我一直很好奇,有没有办法"偷看" stdin缓冲区而不删除那里可能存在的东西?

编辑
一个更好的例子可能是:

scanf("%9[^.]", c);
Run Code Online (Sandbox Code Playgroud)

输入"at.ct"后,现在我还有"data"(ct\n)stdin,而不仅仅是换行符.

c buffer stdin peek

20
推荐指数
1
解决办法
2万
查看次数