1

サード パーティの API にリクエストを送信したところ、XML で次のレスポンスが返されました。

<?xml version="1.0" ?>
<abc>
<xyz>
<code>-112</code>
<message>No such device</message>
</xyz>
</abc>

このコードを使用してこれを読みました。

 XmlDocument doc = new XmlDocument();
    doc.Load("*** url ***");

    XmlNode node = doc.SelectSingleNode("/abc/xyz");
    string code = node.SelectSingleNode("code").InnerText;
    string msg = node.SelectSingleNode("message").InnerText;

    Response.Write("Code: " + code);
Response.Write("Message: "+ msg);

しかし、次の行でエラーが発生します。

string code = node.SelectSingleNode("code").InnerText;

エラーは次のとおりです。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

4

5 に答える 5

6

XML ファイルの最初の行を次のように変更しました。

<?xml version="1.0"?>

有効な XML にします。この変更により、あなたのコードは私のために機能します。変更しないと、パーサーは例外をスローします。

于 2012-08-16T11:14:25.810 に答える
1

いただいたとおり、コードに問題はないようです 編集: svinja が指摘したように、宣言が間違っており、xml が XmlDocument に読み込まれません。

ただし、xml はより複雑であり、少なくとも 1 つの名前空間が含まれているため、選択が失敗する可能性があると思います。

きれいではありませんが、できることは、名前空間に依存しない xpath を使用してノードを見つけ、次の使用を避けることXmlNamespaceManagerです。

XmlDocument doc = new XmlDocument();
doc.Load("*** url ***");

XmlNode node = doc.SelectSingleNode("/*[local-name()='abc']/*[local-name()='xyz']");
string code = node.SelectSingleNode("*[local-name()='code']").InnerText;
string msg = node.SelectSingleNode("*[local-name()='message']").InnerText;

Response.Write("Code: " + code);
Response.Write("Message: "+ msg);

編集 - 詳細

宣言を次のように修正すると、コードは正常に機能します。<?xml version="1.0"?>

ただし、名前空間を混在させると、名前空間マネージャーを適切に使用しない限り、コードは失敗します。

上記の不可知論的な xpath も、次のように xml ドキュメントを解析します。

<?xml version="1.0"?>
<abc xmlns="foo">
    <xyz xmlns="bar">
        <code xmlns="bas">-112</code>
        <message xmlns="xyz">No such device</message>
    </xyz>
</abc>
于 2012-08-16T11:14:44.310 に答える
1

LINQ to XML を使用できます (快適な場合)。

  XDocument doc = XDocument.Load(url);
  var selectors = (from elements in  doc.Elements("abc").Elements("xyz")
                  select elements).FirstOrDefault();
  string code = selectors.Element("code").Value;
  string msg = selectors.Element("message").Value;
于 2012-08-16T11:35:35.953 に答える
0
[XmlRoot("abc")]
public class Entity
{
    [XmlElement("xyz")]
    public SubEntity SubEntity { get; set; }
}

public class SubEntity
{
    [XmlElement("code")]
    public string Code { get; set; }
    [XmlElement("message")]
    public string Message { get; set; }
}

そして、標準を使用しますxmlserializer

       var xmlSerializer = new XmlSerializer(typeof(Entity));
       var result = xmlSerializer.Deserialize(new XmlTextReader("*** url ***"));
       Response.Write("Code: " + result.SubEntity.Code);
       Response.Write("Message: "+ result.SubEntity.Message);
于 2012-08-16T11:16:56.823 に答える
0
<?xml version="1.0">
<abc>
  <xyz>
    <code>-112</code>
    <message> No such device </message>
  </xyz>
</abc>

リストを設定してみてください:

XmlNodeList nodeList = root.SelectNodes("/abc/xyz");

次に、すべてのノードを読み取り、それらのテキストを取得します。

foreach(XmlNode node in nodeList)
{
  if(node.Name == "code")
  {
    string code = node.InnerText;
  }
  else
  if(node.Name == "message")
  {
    string msg = node.InnerText;
  }
}
于 2012-08-16T11:35:03.013 に答える