0

プロジェクトでは、XML ファイルを読み取って文字列データを取得しています。非常にうまく機能しますが、1 つの例外があります。XML ファイルの構造は次のとおりです。

<Table>
    <row>
       <queryId>customAnalyticsParam</queryId>
       <queryStatement>
       1|-1|-1|-1
       </queryStatement>
    </row>
</Table>

table タグには複数の行タグが含まれています。各行タグは queryId タグで区別されます。上記の構造は、次のコードで非常にうまく機能します。

string query = "";
XmlDocument xd = new XmlDocument();
xd.Load(xml_query_filePath);
XmlNode xnode = xd.SelectNodes("/Table/row/queryId[.='" + id.Trim() + "']")[0];
query = xnode.NextSibling.NextSibling.InnerText;

上記のコードの 3 行目の id は、関数のパラメーターで提供される queryId です。XML が次の形式の場合、例外が発生します。

<Table>
   <row>
      <queryId>
      customAnalyticsParam
      </queryId>
      <queryStatement>
      1|-1|-1|-1
      </queryStatement>
   </row>
</Table>

つまり、queryId ノードの前後の行間です。これらの改行スペースが原因で、コードはノードを見つけることができず、null を返します。

方法を見つけるのを手伝ってください。

ありがとう

4

2 に答える 2

3

normalize-spaceで試してください:

XmlNode xnode = xd.SelectNodes("/Table/row/queryId[normalize-space(.)='" + id.Trim() + "']").[0];
于 2013-08-23T09:29:39.520 に答える
0

簡単なTrim()方法でLINQ to XMLを使用して空白を削除することもできます

var xdoc = XDocument.Load(xml_query_filePath);
var statements = from r in xdoc.Descendants("row")
                 let queryId = (string)r.Element("queryId")
                 let statement = (string)r.Element("queryStatement")
                 where queryId.Trim() == id.Trim()
                 select statement.Trim();

または、最初のステートメントだけが必要な場合 (コードのように、要素は xml に存在する必要があることに注意してください)

var statement = xdoc.Descendants("row")
                    .First(r => r.Element("queryId").Value.Trim() == id.Trim())
                    .Element("queryStatement").Value.Trim();
于 2013-08-23T09:51:26.680 に答える