我有一个XML Document
,它有几个具有相同名称和不同属性值的元素,我正在查询从文档中获取数据到数组
foreach (var trade in doc.Descendants("Trd"))
{
var RptSide = trade.Element("RptSide");
sellerAccount = RptSide.Elements("Pty")
.Where(pty => pty.Attribute("Src").Value == "C")
.Select(pty => pty.Attribute("ID").Value)
.FirstOrDefault();
}
我的XML如下
<Trd>
<RptSide Side="1">
<Pty R="1" ID="666">
</Pty>
<Pty R="4" ID="666">
</Pty>
<Pty R="7" ID="ABC">
</Pty>
<Pty R="21" ID="CCC">
</Pty>
<Pty R="22" ID="NY">
</Pty>
**<Pty R="24" Src="C" ID="666ID">**
<Sub Typ="26" ID="1">
</Sub>
</Pty>
<Pty R="24" Src="H" ID="A-62370">
</Pty>
<Pty R="30" ID="apm">
</Pty>
<Pty R="36" ID="testausto">
<Sub Typ="9" ID="Addo Ace">
</Sub>
</Pty>
</RptSide>
</Trd>
从上面的XML中,我期待第ID
个元素的Pty
Attribute Src="C"
666ID
sellerAccount
存储在Src
中,但它是仅考虑第一个没有FirstOrDefault()
属性的Pty元素可能是因为An unhandled exception of type 'System.NullReferenceException' occurred in TestXM.exe
Additional information: Object reference not set to an instance of an object.
的使用。
异常:
sellerAccount = RptSide.Elements("Pty")
.Where(pty => pty.Attribute("R").Value == "24")
.Select(pty => pty.Attribute("ID").Value)
.FirstOrDefault();
但是当我将代码更改为下面时,它工作得很好
Pty
我是否知道查询文档以查找具有Src
属性的class Test {
static function main() {
var sideeffects = 0;
var cached = memoize(function (x) return x + sideeffects++);
cached(1);
trace(sideeffects);//1
cached(1);
trace(sideeffects);//1
cached(3);
trace(sideeffects);//2
cached(3);
trace(sideeffects);//2
}
@:generic static function memoize<In, Out>(f:In->Out):In->Out {
var m = new Map<In, Out>();
return
function (input:In)
return switch m[input] {
case null: m[input] = f(input);
case output: output;
}
}
}
元素的正确方法?
答案 0 :(得分:1)
您只需要在Src
上调用.Value
之前检查NullReferenceException
属性结果,以避免var sellerAccount = RptSide.Elements("Pty")
.Where(pty => pty.Attribute("Src") != null && pty.Attribute("Src").Value.Equals("C"))
.Select(pty => pty.Attribute("ID").Value)
.FirstOrDefault();
。
例如,
using System.Xml.XPath;
或者,(使用var sellerAccount = doc.XPathSelectElement("//*[@Src='C']").Attribute("ID").Value;
),
std::string moduleName = "<full absolute path to DLL that this code is part of>";
DWORD zero = 0;
uint32 verInfoLen = 0;
BYTE *verInfo = NULL;
VS_FIXEDFILEINFO *fileInfo = NULL;
uint32 len = 0;
/* Get the size of FileVersionInfo structure */
verInfoLen = GetFileVersionInfoSize(moduleName.c_str(), &zero);
if (verInfoLen == 0) {
printf("GetFileVersionInfoSize() Failed!");
return;
}
/* Get FileVersionInfo structure */
verInfo = new BYTE[verInfoLen];
if (!GetFileVersionInfo(moduleName.c_str(), zero, verInfoLen, verInfo)) {
printf("GetFileVersionInfo Failed!");
return;
}
/* Query for File version details. */
if (!VerQueryValue(verInfo, "\\", (LPVOID *)&fileInfo, &len)) {
printf("VerQueryValue Failed!");
return;
}
/* None of the above func calls fail - but both printf below print all zeros */
printf("Version is %d.%d.%d.%d",
(fileInfo->dwProductVersionMS >> 16) & 0xff,
(fileInfo->dwProductVersionMS >> 0) & 0xff,
(fileInfo->dwProductVersionLS >> 16) & 0xff,
(fileInfo->dwProductVersionLS >> 0) & 0xff);
printf("Version is %d.%d.%d.%d",
HIWORD(fileInfo->dwProductVersionMS),
LOWORD(fileInfo->dwProductVersionMS),
HIWORD(fileInfo->dwProductVersionLS),
LOWORD(fileInfo->dwProductVersionLS));