如何在根节点具有属性时选择xml根节点?

时间:2011-05-02 10:50:49

标签: c# xml xpath

我正在尝试使用XPath查询选择xml文档的根节点的所有子节点。

我的xml文件如下所示:

<?xml version="1.0" encoding="UTF-8" ?> 
<root>
    <automotive_industry>
        <automotive /> 
        <rail_global_services /> 
    </automotive_industry>
</root>

<?xml version="1.0" encoding="UTF-8" ?> 
<root xmlns="http://www.my_department.my_company.com/project_name">
    <automotive_industry>
        <automotive /> 
        <rail_global_services /> 
    </automotive_industry>
    </root>

选择根节点的C#代码如下:

XmlDocument gazetteDocument = new XmlDocument();
gazetteDocument.Load(xmlFilePath);
XmlNodeList allNodes = gazetteDocument.SelectNodes("root");

此代码工作正常,当根节点没有任何属性时,它选择根节点的所有子节点,它适用于第一个xml文件但不适用于第二个xml文件,因为第二个文件具有xmlns属性。 / p>

当根节点具有属性时,是否有人知道如何选择根节点的所有子节点?

编辑: 我找到了一个XPath查询:/*此查询选择根节点,无论它是否具有任何属性。选择根节点后,我可以遍历其所有子节点。

3 个答案:

答案 0 :(得分:3)

虽然XML文档中的命名空间很好,但您需要在SelectNodes中使用它。 将此代码用于第二个XML:

XmlDocument gazetteDocument = new XmlDocument();
gazetteDocument.Load(xmlFilePath);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(gazetteDocument.NameTable);
nsmgr.AddNamespace("ns", "http://www.my_department.my_company.com/project_name");
XmlNodeList allNodes = gazetteDocument.SelectNodes("ns:root", nsmgr);

更好的方法是使用XDocument和相应的类。它们更易于使用。

答案 1 :(得分:0)

我不知道C#的旧xml方法,但你总是可以打开文件作为普通文本读取,然后读取到第一个节点并按照你喜欢的方式解析它。

答案 2 :(得分:0)

您可以使用下面的GetElementsByTagName方法作为我的代码的片段

import * as sinon from 'sinon';

class MyType {
  constructor(id) {
    this.identifier = id;
  }
  someFunction(arg) { }
}

test('someFunction', () => {
  const stub = sinon.stub(MyType.prototype, 'someFunction');

  const one = new MyType("oneId");
  const two = new MyType("twoId");

  one.someFunction('firstArg');
  two.someFunction('secondArg');

  sinon.assert.calledWith(stub.firstCall, 'firstArg');  // SUCCESS
  sinon.assert.calledOn(stub.firstCall, one);  // SUCCESS
  expect(stub.firstCall.thisValue.identifier).to.equal('oneId');  // SUCCESS

  sinon.assert.calledWith(stub.secondCall, 'secondArg');  // SUCCESS
  sinon.assert.calledOn(stub.secondCall, two);  // SUCCESS
  expect(stub.secondCall.thisValue.identifier).to.equal('twoId');  // SUCCESS
});