0

我有一个xmlnodelist导致以下代码段的结果

<updi:ProductName xmlns:updi="urn:rosettanet:specification:universal:ProductIdentification:xsd:schema:01.04">Packet Processing Card (PPC) 16GB</updi:ProductName>
<ulc:AlternativeIdentifier xmlns:ulc="urn:rosettanet:specification:universal:Locations:xsd:schema:01.04">
  <ulc:Authority>PID</ulc:Authority>
  <ulc:Identifier>ASR5K-PPC-K9=</ulc:Identifier>
</ulc:AlternativeIdentifier>
<ulc:AlternativeIdentifier xmlns:ulc="urn:rosettanet:specification:universal:Locations:xsd:schema:01.04">
  <ulc:Authority>CPN</ulc:Authority>
  <ulc:Identifier />
</ulc:AlternativeIdentifier>

如何获取两个权限和标识符标签?我尝试添加根元素,但命名空间存在问题。原始命名空间声明非常大。

4

3 回答 3

1

好吧,我怀疑您尝试过的 XPath 查询有什么问题 - 更有可能是命名空间让您感到困惑。有几种方法可以补偿/处理这个问题,从“剥离所有命名空间”到使用XmlNamespaceManager- 这是一个例子:

void Main()
{
    var doc = new XmlDocument();
    var namespaceMgr = new XmlNamespaceManager(doc.NameTable);
    namespaceMgr.AddNamespace("updi", "urn:rosettanet:specification:universal:ProductIdentification:xsd:schema:01.04");
    namespaceMgr.AddNamespace("ulc", "urn:rosettanet:specification:universal:Locations:xsd:schema:01.04");
    doc.LoadXml(xml);

    var authorityTags = doc.SelectNodes("//ulc:Authority", namespaceMgr);
    var identifierTags = doc.SelectNodes("//ulc:Identifier", namespaceMgr);
}

假设 xml 是:

    string xml = @"
    <ROOT>
    <updi:ProductName xmlns:updi=""urn:rosettanet:specification:universal:ProductIdentification:xsd:schema:01.04"">
    Packet Processing Card (PPC) 16GB
    </updi:ProductName>
    <ulc:AlternativeIdentifier xmlns:ulc=""urn:rosettanet:specification:universal:Locations:xsd:schema:01.04"">
    <ulc:Authority>PID</ulc:Authority>
    <ulc:Identifier>ASR5K-PPC-K9=</ulc:Identifier>
    </ulc:AlternativeIdentifier>
    <ulc:AlternativeIdentifier xmlns:ulc=""urn:rosettanet:specification:universal:Locations:xsd:schema:01.04"">
    <ulc:Authority>CPN</ulc:Authority>
    <ulc:Identifier />
    </ulc:AlternativeIdentifier>
    </ROOT>";
于 2013-02-14T20:39:05.653 回答
0

下面将返回您的示例中的所有四个节点。我确实必须将它包装在根节点中以进行测试。|运算符允许联合功能。

//ulc:AlternativeIdentifier/ulc:Authority | //ulc:AlternativeIdentifier/ulc:Identifier

我使用Notepad++和我强烈推荐的XPatherizerNPP插件对此进行了测试。

于 2013-02-14T20:24:11.303 回答
0

像这样的东西可以解决问题:

XmlDocument doc = new XmlDocument();
doc.Load("YourXmlFile");

foreach (XmlNode node in doc.SelectNodes("//*[local-name() = \"Authority\"]"))
{
    Console.WriteLine("Authority: " + node.InnerText);
}

foreach (XmlNode node in doc.SelectNodes("//*[local-name() = \"Identifier\"]"))
{
    Console.WriteLine("Identifier: " + node.InnerText);
}

基本上,SelectNodes("//*[local-name() = \"Identifier\"]")告诉它使用该名称在 xml 中搜索节点,而不考虑名称空间等。

于 2013-02-14T22:40:09.280 回答