2

HtmlAgilityPack翻訳プログラムのGoogle翻訳から情報をかき集めるために使用しています。HtmlAgilityPackdllをダウンロードし、プログラムで正常に参照しました。UnityでAssemblyを使用しています。以下は、2 つのプログラムのコードです。

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using HtmlAgilityPack;

public class GUIScript : MonoBehaviour {
    private string textField = "";
    private string input;
    public Texture2D icon;
    Dictionary search;
    Encoding code;
    // Use this for initialization
    void Start () { 
        search = new Dictionary();
        input = " ";
        code = Encoding.UTF8;
        //This is what is run to translate
        print (search.Translate("Hola","es|en",code));
    }

    // Update is called once per frame
    void Update () {

    }
    void OnGUI(){
        textField = GUI.TextField(new Rect(0, Screen.height -50, Screen.width-80, 40), textField);
        if(GUI.Button(new Rect(Screen.width-80, Screen.height -50, 80,40), icon)){
            input = textField;
            textField = "";

        }
        //GUI.Label(new Rect(0,Screen.height -70, Screen.width-80,20), search.Translate("Hola","es|en",code));
        //print (search.Translate("Hola","es|en",code));
    }
}

Dictionaryこれは、以下に示す私のクラスを参照するコードです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using System.Collections;
using System.Net;
using HtmlAgilityPack;


public class Dictionary{
    string[] formatParams;
    HtmlDocument doc;
    public Dictionary(){
        formatParams = new string[2];
        doc = new HtmlDocument();
    }
    public string Translate(String input, String languagePair, Encoding encoding)
     {
        formatParams[0]= input;
        formatParams[1]= languagePair;
        string url = String.Format("http://www.google.com/translate_t?hl=en&ie=UTF8&text={0}&langpair={1}", formatParams);

        string result = String.Empty;

        using (WebClient webClient = new WebClient())
        {
            webClient.Encoding = encoding;
            result = webClient.DownloadString(url);
        }       
        doc.LoadHtml(result);
        return doc.DocumentNode.SelectSingleNode("//span[@title=input]").InnerText;
    }
    // Use this for initialization
    void Start () {

    }
}

これを実行すると、次のエラーが表示されます。

NullReferenceException: Object reference not set to an instance of an object
Dictionary.Translate (System.String input, System.String languagePair,System.Text.Encoding encoding) (at Assets/Dictionary.cs:32)
GUIScript.Start () (at Assets/GUIScript.cs:22)

コードの変更、解決策、 の API HtmlDocument、および の修正方法の検索を試みましNullReferenceExceptionsたが、何らかの理由でNullReferenceException. この問題で 1、2 週間足止めされており、プロジェクトを進める必要があります。どんな助けでも大歓迎です!

4

2 に答える 2

2

正しくカウントした場合、これは 32 行目です。

return doc.DocumentNode.SelectSingleNode("//span[@title=input]").InnerText

つまり、doc.DocumentNodenullであるか、nullDocumentNode.SelectSingleNode("//span[@title=input]")を返しています。

前者の場合は、実際の書類が戻ってきていることを確認してください。URL が正しくエンコードされていない可能性があります。HTML Agility Pack の HtmlDocument.DocumentNode が null である理由も参照してください。

後者の場合、XPath で何かおかしなことが起こっている可能性があります。DocumentNodeこれがドキュメントのルートであるべきであるため、これがどれほど関連性があるかはわかりません。http://htmlagilitypack.codeplex.com/discussions/249129での議論が適用される可能性があります。これによると、「//」はドキュメントのルートからの検索であり、代わりに試してみる必要があるかもしれません(文字列の先頭にdoc.DocumentNode.SelectSingleNode(".//span[@title=input]")a を追加します)。.

メソッドをデバッグし、これらの呼び出しの値を正確に確認すると、ジョブが終了します。

于 2012-10-23T13:53:58.863 に答える
0

何を取得しようとしていますか? あなたが使用している URL を開いて、単純な検索を行ったところ、title=input何も返されませんでした。こんにちは、Hola の翻訳を探しているのではないでしょうか?

もしそうなら、コンソールアプリでこれを行いました。お役に立てれば。

    static void Main(string[] args)
    {
        string Input = "Hola";
        HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = web.Load("http://www.google.com/translate_t?hl=en&ie=UTF8&text=Hola&langpair=es|en");

        string definition = doc.DocumentNode.SelectSingleNode(string.Format("//span[@title='{0}']",Input)).InnerText;
        Console.WriteLine(definition);
        Console.ReadKey();
    }

編集:あなたが探していたのではtitle=inputなく、title=Hola. 私のコードでわかるように、String.Format(("//span[@title='{0}']",Input). これにより、変数のテキストがInput文字列行に挿入されます。

于 2012-10-24T21:08:06.330 に答える