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>

2つの権限タグと識別子タグを取得するにはどうすればよいですか?ルート要素を追加しようとしましたが、名前空間に問題があります。元の名前空間宣言は非常に大きいです。

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

このようなものはトリックを行います:

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 に答える
0

以下は、サンプルから 4 つのノードすべてを返します。テストのためにルートノードにラップする必要がありました。|演算子はユニオン機能を許可します

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

XPatherizerNPPプラグインを使用してNotepad++を使用してこれをテストしました。これを強くお勧めします。

于 2013-02-14T20:24:11.303 に答える