1

しばらく時間がかかりましたが、ようやく名前空間とノード名のユーザー入力に基づいて XML ドキュメントを変更することができました。

string nodeName = "DefinitionName"; // this is really provided by the user
string namespace = "http://schemas.datacontract.org/2004/07/Xxx.Session";  // also user-provided

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(taskResolved.XmlPathAndFileName);
XmlElement rootElement = xmlDocument.DocumentElement;
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(xmlDocument.NameTable);
namespaceManager.AddNamespace("snuh", namespace);  // hard-coded prefix, grrr...

XmlNodeList xmlNodes;

xmlNodes = rootElement.SelectNodes("//snuh:" + nodeName, namespaceManager);

プレフィックスをハードコーディングする必要があるため、何か間違ったことをしているように感じます (snuh)。snuh のように、ドキュメントに決して現れないことを期待できる接頭辞を選択することもできますが、それは絶対確実ではありません。もう 1 つのオプションは、プレフィックスに GUID を使用することですが、これはハックによる回避策のように思えます。何か不足していますか?より良い方法はありますか?

XML ドキュメントの上部は次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<SessionStateInfo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" z:Id="1"
    z:Type="Xxx.SessionStateInfo"
    z:Assembly="Xxx.Common, Version=6.2.0.0, Culture=neutral, PublicKeyToken=null"
    xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"
    xmlns="http://schemas.datacontract.org/2004/07/Xxx.Session">
      <CoaterNumber>25</CoaterNumber>
      <DefinitionName z:Id="2">TwoLineMarkerDefinition</DefinitionName>
      <EnableManualMode>true</EnableManualMode>
4

2 に答える 2

2

単純に最初の DefinitionName ノードを選択する場合。

あなたは書くかもしれません

XmlNode node = rootElement[nodeName, namespace];

リスト全体が必要な場合:

XmlNodeList nodeList = rootElement.GetElementsByTagName(nodeName, namespace);
于 2013-03-29T15:11:49.497 に答える
1

XPathlocal-name()namespace-uri()関数の使用についてはどうでしょうか。

string xpath = string.Format("//*[local-name()='{0}' and namespace-uri()='{1}']", nodeName, namespace);
xmlNodes = rootElement.SelectNodes(xpath);

これらの機能がサポートされているかどうかはわかりませんがXmlDocument、テストしていません。

于 2013-03-29T15:05:00.267 に答える