0

商用アプリケーションは、XML を使用して、使用する変数のリストを保持します。XML の形式を制御することはできません。のどのバージョンでも使用できます.Net

UserVar作成したオブジェクトにノードを割り当てるためのより単純なコードを作成しようとしています。今、私はすべての個々の を含む UserVars のセクションのノードを見つけ、要素「名前」を探しUserVarsてそれぞれを繰り返し、それが目的の変数名と一致するかどうかを確認します。UserVar

たとえば、変数「Changed」が必要な場合、プロパティをAcmeVar持つオブジェクト (私の作成) を取得し、 「Changed」と 1 に設定します。ただし、コードを手動で反復する必要があります。NameWidth

私はこれを難しい方法でやっているようです。UserVar理想的には、Linq を使用して、一致する要素 Name を持つノードを返したいと思います。Stackoverflow に関する同様の質問は、同様のパターンに従っていないか、少なくとも私が見ることができるものではありません。すべての変数がすべての要素タイプを使用するわけではありません。

サンプル: XML

<?xml version="1.0" encoding="UTF-8"?>
<Application>
  <Vars>
    <UserVars>
      <UserVar>
        <Name>"Quantity"</Name>
        <Width>4</Width>
        <VarValue>"1"</VarValue>
      </UserVar>
      <UserVar>
        <Name>"Printers"</Name>
        <Width>255</Width>
      </UserVar>
      <UserVar>
        <Name>"Changed"</Name>
        <Width>1</Width>
      </UserVar>
      <UserVar>
        <Name>"Weight"</Name>
        <VarValue>"450.1"</VarValue>
      </UserVar>
    </UserVars>
  </Vars>
</Application>

現在のコード:

public static bool GetVariable(string xmlDocNm, string varName, out AcmeVariable acmeVar)
{
  // Returns true if found without error

  bool result = false;
  acmeVar = new AcmeVariable ();

  try {
    XPathDocument doc = new XPathDocument(xmlDocNm);
    XPathNavigator nav = doc.CreateNavigator();

    // Compile a standard XPath expression
    XPathExpression expr;
    expr = nav.Compile(AcmeConst.XPathInternalVariable);
    XPathNodeIterator iterator = nav.Select(expr);

    // Iterate on the node set
    try {
      bool variableFound;
      bool skipNode;

      char[] CharsToTrim = { '\"' }; // 
      while (iterator.MoveNext()) {
        variableFound = false;
        skipNode = false;
        XPathNavigator nav2 = iterator.Current.Clone();
        if (nav2.MoveToFirstChild()) {
          // nav2 points to the first element in an UserVar Node
          acmeVar = new AcmeVariable ();               //Start with a fresh Acme Variable

          if (nav2.LocalName == AcmeConst.AttrName) {
            variableFound = true;
            skipNode = nav2.Value.Trim(CharsToTrim) != varName;
          }
          if (!skipNode) {
            AssignXMLNavNodetoAcmeVar(nav2, acmeVar);
            while (nav2.MoveToNext() && !skipNode) {
              if (nav2.LocalName == AcmeConst.AttrName) {
                variableFound = true;
                skipNode = nav2.Value.Trim(CharsToTrim) != varName;
              }
              AssignXMLNavNodetoAcmeVar(nav2, acmeVar);
            }
          }
        }
        if (variableFound && !skipNode) {
          result = true;
          break; //We have found the variable and collected all elements
        }
        else {
          acmeVar = null;
        }
      }
    }
    catch (Exception ex) {
      MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
      acmeVar = null;
      result = false;
    }
  }
  catch (Exception ex) {
    MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
    acmeVar = null;
    result = false;
  }

  return result;
} 
4

2 に答える 2

3

これを試して:

var queryValue = "Quantity";
var xDoc = XDocument.Load(@"UserVars.xml");//This is your xml path value

var userVar = xDoc.Descendents("UserVar").Where(x => x.Element("Name").Value == queryValue )
                  .FirstOrDefault();

var name     = userVar.Element("Name").Value ?? string.Empty;
var width    = userVar.Element("Width").Value ?? string.Empty;
var varValue = userVar.Element("VarValue").Value ?? string.Empty;

<Name>"Quantity"</Name>特に要素の値が で囲まれている部分で、XML にコメントを付けたいだけです。""

ただし、xml にバインドされていない場合は、それらをエスケープするだけです"。例えば。var queryValue = @""Quantity"";

于 2013-04-28T23:51:32.723 に答える
1

キーが Name であり、すべてのノードにそれが含まれていると仮定すると、これは機能するはずです。

string valImLookingFor = "\"Changed\"";
XDocument doc = XDocument.Load("file"); // or XDocument doc = XDocument.Parse(xmlString);

var node = doc.Descendants("UserVar").Where(x => x.Element("Name").Value == valImLookingFor).First();

これでノードが取得され、必要なサブノードの値を引き出すことができます。

于 2013-04-28T23:41:55.133 に答える