2011-12-06 14 views
2

XMLファイルを読み込むために使用したXPathExpressionsがたくさんあります。私は今、他の道を行く必要があります。 (私が持っている値に基づいてXMLファイルを生成する)XPathExpressionsからXMLファイルを作成する

ここに示す例があります。私はこのようなコードの束を持っていると言う:

XPathExpression hl7Expr1 = navigator.Compile("/ORM_O01/MSH/MSH.6/HD.1"); 
var hl7Expr2 = navigator.Compile("/ORM_O01/ORM_O01.PATIENT/PID/PID.18/CX.1"); 
var hl7Expr3 = navigator.Compile("/ORM_O01/ORM_O01.PATIENT/ORM_O01.PATIENT_VISIT/PV1/PV1.19/CX.1"); 
var hl7Expr4 = navigator.Compile("/ORM_O01/ORM_O01.PATIENT/PID/PID.3[1]/CX.1"); 
var hl7Expr5 = navigator.Compile("/ORM_O01/ORM_O01.PATIENT/PID/PID.5[1]/XPN.1/FN.1"); 
var hl7Expr6 = navigator.Compile("/ORM_O01/ORM_O01.PATIENT/PID/PID.5[1]/XPN.2"); 

string hl7Value1 = "SomeValue1"; 
string hl7Value2 = "SomeValue2"; 
string hl7Value3 = "SomeValue3"; 
string hl7Value4 = "SomeValue4"; 
string hl7Value5 = "SomeValue5"; 
string hl7Value6 = "SomeValue6"; 

はhl7Expr XPathExpressionsを取り、それの対応hl7Value文字列とXMLファイルを生成する方法はありますか?

(XPathExpressionオブジェクトを使用する代わりに)実際のパス文字列を使用して生成するだけでもいいですか?

ノート:私はこの質問を見ました:Create XML Nodes based on XPath?しかし、回答は[1] hl7Expr4のような参考文献を考慮していません。

答えて

2

私はこの答えが見つかりました:https://stackoverflow.com/a/3465832/16241

をそして私は(このような)属性に[1]を変換する主な方法を変更することができました:

public static XmlNode CreateXPath(XmlDocument doc, string xpath) 
{ 
    XmlNode node = doc; 
    foreach (string part in xpath.Substring(1).Split('/')) 
    { 
     XmlNodeList nodes = node.SelectNodes(part); 
     if (nodes.Count > 1) throw new ApplicationException("Xpath '" + xpath + "' was not found multiple times!"); 
     else if (nodes.Count == 1) { node = nodes[0]; continue; } 

     if (part.StartsWith("@")) 
     { 
      var anode = doc.CreateAttribute(part.Substring(1)); 
      node.Attributes.Append(anode); 
      node = anode; 
     } 
     else 
     { 
      string elName, attrib = null; 
      if (part.Contains("[")) 
      { 
       part.SplitOnce("[", out elName, out attrib); 
       if (!attrib.EndsWith("]")) throw new ApplicationException("Unsupported XPath (missing ]): " + part); 
       attrib = attrib.Substring(0, attrib.Length - 1); 
      } 
      else elName = part; 

      XmlNode next = doc.CreateElement(elName); 
      node.AppendChild(next); 
      node = next; 

      if (attrib != null) 
      { 
       if (!attrib.StartsWith("@")) 
       { 
        attrib = " Id='" + attrib + "'"; 
       } 
       string name, value; 
       attrib.Substring(1).SplitOnce("='", out name, out value); 
       if (string.IsNullOrEmpty(value) || !value.EndsWith("'")) throw new ApplicationException("Unsupported XPath attrib: " + part); 
       value = value.Substring(0, value.Length - 1); 
       var anode = doc.CreateAttribute(name); 
       anode.Value = value; 
       node.Attributes.Append(anode); 
      } 
     } 
    } 
    return node; 
} 
関連する問題