-3

何が起こっている \ 違いは何ですか ? XML ファイルから特定のノードを返そうとしています。

XML ファイル:

  <?xml version="1.0" encoding="utf-8"?>
    <JMF SenderID="InkZone-Controller" Version="1.2">
      <Command ID="cmd.00695" Type="Resource">
        <ResourceCMDParams ResourceName="InkZoneProfile" JobID="K_41">
          <InkZoneProfile ID="r0013" Class="Parameter" Locked="false" Status="Available" PartIDKeys="SignatureName SheetName Side Separation" DescriptiveName="Schieberwerte von DI" ZoneWidth="32">
            <InkZoneProfile SignatureName="SIG1">
              <InkZoneProfile Locked="False" SheetName="S1">
                <InkZoneProfile Side="Front" />
              </InkZoneProfile>
            </InkZoneProfile>
          </InkZoneProfile>
        </ResourceCMDParams>
      </Command>
<InkZoneProfile Separation="Cyan" ZoneSettingsX="0 0,005 " />
    </JMF>

コード:

           XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("C:\\test\\test.xml");
            XmlNode root = xmlDoc.DocumentElement;
            var parent = root.SelectSingleNode("/JMF/Command/ResourceCmdParams/InkZoneProfile/InkZoneProfile/InkZoneProfile/InkZoneProfile");

            XmlElement IZP = xmlDoc.CreateElement("InkZoneProfile");
            IZP.SetAttribute("Separation", x.colorname);
            IZP.SetAttribute("ZoneSettingsX", x.colorvalues);
            xmlDoc.DocumentElement.AppendChild(IZP);
            xmlDoc.Save("C:\\test\\test.xml");

var 親は null を返します。をデバッグしましたが、ルートと xmlDoc の内部テキストに XML コンテンツがあります。しかし、ここで行われたテスト (前の質問でユーザー @har07 によって行われました: 名前空間を管理していても SelectSingleNode は null を返します) 問題なく動作しました。 https://dotnetfiddle.net/vJ8h9S

これら2つの違いは何ですか? 基本的には同じコードに従いますが、一方は機能し、他方は機能しません。
デバッグ時に、 root.InnerXml 自体にコンテンツがロードされていることがわかりました( XmlDoc.InnerXml と同じ)。しかし、InnerXml は SelectSingleNode へのメソッドを実装していません。文字列に保存すると、おそらくインデントなどが失われると思います。

誰かが何が違うのか、何が間違っているのか教えてもらえますか? ありがとう !XML サンプル: https://drive.google.com/file/d/0BwU9_GrFRYrTUFhMYWk5blhhZWM/view?usp=sharing

4

1 に答える 1

1

SetAttribute自動エスケープ文字列を使用しないでください。したがって、XML ファイルが無効になります。

MSDN からXmlElement.SetAttributeについて

エンティティ参照として認識される構文などのマークアップは、リテラル テキストとして扱われ、書き出されるときに実装によって適切にエスケープされる必要があります。

コード内ですべての行が含まれていることを確認し、値をエスケープするためにSetAttribute使用します。SecurityElement.Escape

例: 次の行を変更します。

IZP.SetAttribute("Separation", x.colorname);
IZP.SetAttribute("ZoneSettingsX", x.colorvalues);

に:

using System.Security;

IZP.SetAttribute("Separation", SecurityElement.Escape(x.colorname));
IZP.SetAttribute("ZoneSettingsX", SecurityElement.Escape(x.colorvalues));

属性に名前が含まれている場合は<>"'&、値のようにエスケープする必要もあります。

ノート:

古いコードを使用して作成した現在のxmlを削除する必要があります。これは無効であるため、ロードすると例外が発生します。

于 2016-02-28T02:35:29.787 に答える